Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何刷新Windows中的所有文件缓冲区?_C++_C_File_Winapi_Buffer - Fatal编程技术网

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

C++ 如何刷新Windows中的所有文件缓冲区?,c++,c,file,winapi,buffer,C++,C,File,Winapi,Buffer,Windows中有FlushFileBuffers()API,可以将缓冲区刷新到单个文件的硬盘驱动器。Linux中有sync()API来刷新所有文件的文件缓冲区 但是,是否也有用于刷新所有文件的WinAPI,即sync()analog?根据WinAPI中没有任何来自Linux的sync()analog。 可以刷新整个硬盘驱动器 要刷新卷上所有打开的文件,请使用卷句柄调用FlushFileBuffers。调用方必须具有管理权限。有关详细信息,请参阅以特殊权限运行 此外,同一篇文章还说明了如果出于某

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

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

根据WinAPI中没有任何来自Linux的
sync()
analog。

可以刷新整个硬盘驱动器

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

此外,同一篇文章还说明了如果出于某种原因,必须刷新数据时应遵循的正确过程:
CreateFile
函数带有
FILE\u标志\u无缓冲
FILE\u标志\u写入
标志

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


但也要检查关于内存和数据对齐的限制。

fflush(NULL)为您工作,因为它被指定为“如果
stream
是空指针,那么
fflush
函数对上面定义了行为的所有流执行此刷新操作”@chux,我认为
fflush
只刷新与文件*关联的C/C++库缓冲区。它不会刷新操作系统缓冲区。@chux-
fflush
这用于刷新当前进程中的内部crt流。FlushFileBuffers没有什么共同之处(
IRP_MJ_FLUSH_BUFFERS
)一个好的应用程序就是停止在Windows中尝试Linux,反之亦然。原理是完全不同的。你能告诉代码如何刷新吗?例如,驱动
C:
?我不明白打开卷的路径中有什么。。。您可以使用像“\.\\C:”这样的字符串来打开这样的句柄。然而,为什么你真的想刷新驱动器?@MichaelChourdakis-你想刷新驱动器以知道数据确实在那里-即使在将文件写入磁盘后,位仍然可以在windows和驱动器内的缓存中。如果调用flush,然后出现电源故障,则表示位已写入。如果你不这样做,就不能保证。内部操作(如弹出U盘)也会进行刷新。