Windows中有FlushFileBuffers()
API可以将缓冲区刷新到单个文件的硬盘驱动器。 Linux中有sync()
API用于刷新所有文件的文件缓冲区。
但是,是否也有WinAPI也可以刷新所有文件,即sync()
模拟文件?
答案 0 :(得分:4)
https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-flushfilebuffers
可以刷新整个硬盘驱动器。
要刷新卷上所有打开的文件,请调用带有该卷句柄的FlushFileBuffers。呼叫者必须具有管理权限。有关更多信息,请参见以特殊特权运行。
同一篇文章还指出了由于某种原因必须刷新数据的正确过程:CreateFile
函数带有FILE_FLAG_NO_BUFFERING
和FILE_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()
类似物。