FlushFileBuffers 函数 (fileapi.h)
刷新指定文件的缓冲区,并导致所有缓冲数据写入文件。
语法
BOOL FlushFileBuffers(
[in] HANDLE hFile
);
参数
[in] hFile
打开文件的句柄。
文件句柄必须具有 GENERIC_WRITE 访问权限。 有关详细信息,请参阅 文件安全和访问权限。
如果 hFile 是通信设备的句柄,则函数只会刷新传输缓冲区。
如果 hFile 是命名管道的服务器端的句柄,则在客户端从管道读取所有缓冲数据之前,该函数不会返回。
返回值
如果函数成功,则返回值为非零。
如果函数失败,则返回值为零。 若要获取扩展的错误信息,请调用 GetLastError。
如果 hFile 是控制台输出的句柄,则函数将失败。 这是因为控制台输出未缓冲。 该函数返回 FALSE,GetLastError 返回 ERROR_INVALID_HANDLE。
言论
通常,WriteFile 和 WriteFileEx 函数将数据写入操作系统定期写入磁盘或通信管道的内部缓冲区。 FlushFileBuffers 函数将指定文件的所有缓冲信息写入设备或管道。
由于系统中的磁盘缓存交互,FlushFileBuffers 函数在每次写入磁盘驱动器设备后使用时,在单独执行许多写入操作时可能会效率低下。 如果应用程序正在对磁盘执行多个写入,并且还需要确保将关键数据写入永久性媒体,则应用程序应使用无缓冲区 I/O,而不是频繁调用 FlushFileBuffers。 若要打开无缓冲区 I/O 的文件,请使用 FILE_FLAG_NO_BUFFERING 和 FILE_FLAG_WRITE_THROUGH 标志调用 CreateFile 函数。 这样可以防止文件内容被缓存,并通过每次写入将元数据刷新到磁盘。 有关详细信息,请参阅 CreateFile。
若要刷新卷上所有打开的文件,请使用卷的句柄调用 FlushFileBuffers。 调用方必须具有管理权限。 有关详细信息,请参阅 使用特殊特权运行。
使用 CreateFile打开卷时,lpFileName 字符串应采用以下格式:\.\x: 或 \\?\Volume{GUID}。 不要在卷名称中使用尾随反斜杠,因为这表示驱动器的根目录。
在 Windows 8 和 Windows Server 2012 中,以下技术支持此函数。
科技 | 支持 |
---|---|
服务器消息块 (SMB) 3.0 协议 | 是的 |
SMB 3.0 透明故障转移 (TFO) | 是的 |
具有横向扩展文件共享的 SMB 3.0 (SO) | 是的 |
群集共享卷文件系统 (CsvFS) | 是的 |
可复原文件系统 (ReFS) | 是的 |
例子
有关示例,请参阅 多线程管道服务器。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | Windows XP [桌面应用 |UWP 应用] |
支持的最低服务器 | Windows Server 2003 [桌面应用 |UWP 应用] |
目标平台 | 窗户 |
标头 | fileapi.h (包括 Windows.h) |
库 | Kernel32.lib |
DLL | Kernel32.dll |