首页 > 解决方案 > 如何刷新 Windows 中的所有文件缓冲区?

问题描述

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

但是,是否也有用于刷新所有文件的 WinAPI,即sync()模拟?

标签: c++cfilewinapibuffer

解决方案


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

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

要刷新卷上所有打开的文件,请使用卷的句柄调用 FlushFileBuffers。调用者必须具有管理权限。有关详细信息,请参阅以特殊权限运行。

此外,同一篇文章说明了如果由于某种原因必须刷新数据时要遵循的正确过程: CreateFile使用FILE_FLAG_NO_BUFFERINGandFILE_FLAG_WRITE_THROUGH标志的函数。

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

但还要检查文件缓冲关于内存和数据对齐的限制。


推荐阅读