如何刷新Windows中的所有文件缓冲区?

时间:2019-01-06 18:53:55

标签: c++ c file winapi buffer

Windows中有FlushFileBuffers() API可以将缓冲区刷新到单个文件的硬盘驱动器。 Linux中有sync() API用于刷新所有文件的文件缓冲区。

但是,是否也有WinAPI也可以刷新所有文件,即sync()模拟文件?

2 个答案:

答案 0 :(得分:4)

https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-flushfilebuffers

可以刷新整个硬盘驱动器。

  

要刷新卷上所有打开的文件,请调用带有该卷句柄的FlushFileBuffers。呼叫者必须具有管理权限。有关更多信息,请参见以特殊特权运行。

同一篇文章还指出了由于某种原因必须刷新数据的正确过程:CreateFile函数带有FILE_FLAG_NO_BUFFERINGFILE_FLAG_WRITE_THROUGH标志。

  

由于系统中存在磁盘缓存交互作用,因此在每次单独执行许多写入操作时,每次写入磁盘驱动器设备后使用FlushFileBuffers函数时,效率可能很低。如果应用程序正在执行多次磁盘写操作,并且还需要确保将关键数据写入持久性媒体,则应用程序应使用无缓冲的I / O,而不是频繁调用FlushFileBuffers。要为无缓冲I / O打开文件,请使用FILE_FLAG_NO_BUFFERING和FILE_FLAG_WRITE_THROUGH标志调用CreateFile函数。这样可以防止文件内容被缓存,并在每次写入时将元数据刷新到磁盘。有关更多信息,请参见CreateFile。

还要检查file buffering关于内存和数据对齐的限制。

答案 1 :(得分:2)

根据File Management Functions,在WinAPI中没有来自Linux的任何sync()类似物。