c++ - 如何刷新 Windows 中的所有文件缓冲区?
问题描述
Windows 中有FlushFileBuffers()
API 可以将缓冲区刷新到单个文件的硬盘驱动器。Linux 中有sync()
用于刷新所有文件的文件缓冲区的 API。
但是,是否也有用于刷新所有文件的 WinAPI,即sync()
模拟?
解决方案
https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-flushfilebuffers
可以刷新整个硬盘驱动器。
要刷新卷上所有打开的文件,请使用卷的句柄调用 FlushFileBuffers。调用者必须具有管理权限。有关详细信息,请参阅以特殊权限运行。
此外,同一篇文章说明了如果由于某种原因必须刷新数据时要遵循的正确过程: CreateFile
使用FILE_FLAG_NO_BUFFERING
andFILE_FLAG_WRITE_THROUGH
标志的函数。
由于系统内的磁盘缓存交互,在单独执行许多写入时,在每次写入磁盘驱动器设备后使用 FlushFileBuffers 函数可能效率低下。如果应用程序正在对磁盘执行多次写入,并且还需要确保将关键数据写入持久性介质,则应用程序应使用无缓冲 I/O,而不是频繁调用 FlushFileBuffers。要为无缓冲 I/O 打开文件,请使用 FILE_FLAG_NO_BUFFERING 和 FILE_FLAG_WRITE_THROUGH 标志调用 CreateFile 函数。这可以防止文件内容被缓存,并在每次写入时将元数据刷新到磁盘。有关详细信息,请参阅创建文件。
但还要检查文件缓冲关于内存和数据对齐的限制。
推荐阅读
- rust - 是否有无堆特征对象?
- angularjs - 模块“分析”不可用!您要么拼错了模块名称,要么忘记加载它
- amazon-web-services - Aws 应用程序负载均衡器 - 目标的最大连接数?
- sql - 从雪花中提取@
- c++ - 类型特征以确定数据成员的访问说明符,从指向该成员的指针到该成员
- python - Pytorch 模型渐变没有使用一些自定义代码进行更新
- angular - 如何一个接一个地执行函数?
- c# - MaterialDesignThemes ComboBox Selected Item模板问题
- vba - 我如何将此子从表 1 移动到表 2
- azure-devops - 尝试高级管道时,“其他存储库中的模板在引用另一个模板时可能未指定存储库源”