即时消息接收图片立即加载失败问题

在即时消息聊天中,收到图片并及时下载进行展示出来是正常需求。

然而,当我们通过socket将图片下载完成以后,通过writefile将数据全部写入以后并关闭文件句柄(CloseHandle(m_file_handle);),然后立即去加载图片显示的时候,却出现图片加载失败的问题,必须要延迟300~500ms才可以正常的读取图片。这是为什么呢?

HANDLE file_handle = INVALID_HANDLE_VALUE;

try

{

file_handle = CreateFile

(

s2t(file_path).c_str(),  //文件路径

GENERIC_WRITE,

FILE_SHARE_WRITE | FILE_SHARE_READ, //共享读和共享写

NULL,

OPEN_EXISTING,

FILE_ATTRIBUTE_NORMAL,

0

);



if(file_handle == INVALID_HANDLE_VALUE)

{

return false;

}

}

catch (std::exception& e)

{

log_dbg("[error]%s",e.what());

return false;

}

        其实是这样的,当我们通过句柄把文件流写入到文件并关闭以后,其实文件数据并没有写入到硬盘文件里面,而是保存在内存的文件缓冲区里,系统在到达合适的时机才会将文件写入到硬盘,所以我们要访问文件的时候,其实真正的文件还没有生成,所以会加重失败。

        那么,这样的问题怎么解决呢???


        有一个办法把写文件缓冲区的数据强制写入磁盘。

FlushFileBuffers(m_file_handle);

      msdn中的介绍:详见FlushFileBuffers函数的Remarks部分。

使用CreateFile创建文件,同时设置FILE_FLAG_NO_BUFFERING(不适用缓存) 属性,但文件仍有可能被缓存,使用该接口将文件迅速写入到硬盘上。然后再关闭文件句柄。


        最终要注意一点,上面打开文件的时候使用了FILE_SHARE_WRITE | FILE_SHARE_READ属性,写属性就不用多说了。共享读的作用是下载完成后需要读取文件,当文件可能被占用时还可以正常读取显示,正常加载。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值