WinAPI技术问询:同一文件不同句柄读写是否需要执行刷新?
同一进程双文件句柄读写场景下的刷新操作必要性分析
这个问题得结合Windows文件系统的缓存机制和句柄的行为来拆解,咱们分场景讨论:
核心前提回顾
你这里的场景是同一进程内打开了同一个文件的两个句柄:
hFile1:拥有读写权限,共享模式允许读写共享hFile2:拥有只读权限,共享模式同样允许读写共享
默认创建方式下,两个句柄都会使用Windows的文件系统缓存(除非指定了FILE_FLAG_NO_BUFFERING或FILE_FLAG_WRITE_THROUGH)。
场景1:仅需在同一进程内用hFile2读取刚写入的内容
这种情况下不需要执行刷新操作。原因是:
- Windows的文件系统缓存是按文件实例关联的,同一进程内的多个句柄会共享这个缓存。当你通过
hFile1调用WriteFile成功后,数据已经被写入到内存缓存中,hFile2的读取操作会直接从这个共享缓存中获取最新数据,无需等待数据刷到磁盘。 - 注意:每个句柄的文件指针是独立的,读取前需要确保
hFile2的指针已经定位到你写入的位置(比如调用SetFilePointerEx(hFile2, ...)),否则可能读到旧位置的内容。
场景2:需要确保写入的数据持久化到磁盘
如果你的需求是即使进程崩溃、系统重启后,数据依然能被读取到,或者需要让其他进程(而非当前进程的另一个句柄)看到最新写入的数据,那必须执行刷新操作:
- 调用
FlushFileBuffers(hFile1):这个函数会把hFile1关联的所有缓存数据强制刷新到磁盘,确保数据持久化。 - 替代方案:创建
hFile1时指定FILE_FLAG_WRITE_THROUGH标记,这样WriteFile会直接将数据写入磁盘,绕过缓存(但会牺牲一定的写入性能)。
特殊情况:禁用文件缓存的场景
如果创建句柄时指定了FILE_FLAG_NO_BUFFERING,那么:
WriteFile成功后数据已经直接写入磁盘,无需额外刷新。但这种模式对文件指针、缓冲区大小和对齐方式有严格要求,一般只用于高性能IO场景。
内容的提问来源于stack exchange,提问作者Ross Bencina
相关产品推荐
相关产品推荐

