小甲鱼 发表于 2016-7-28 16:56:17

FlushFileBuffers

注:本文档由 谁动了我的豆包 翻译,小甲鱼校对。

原文链接 -> 传送门

函数功能:

FlushFileBuffers 函数用于刷新指定文件的缓冲区,并把全部缓冲数据写入一个文件。


API 函数原型:

注释:_In_ 说明该参数是输入的。
BOOL WINAPI FlushFileBuffers(
_In_ HANDLE hFile
);

参数解析:


参数 含义
hFile1. 指定一个打开的文件的句柄

2. 该文件句柄必须有 GENERIC_WRITE 使用权。更多内容,请参见 File Security and Access Rights

3. 如果 hFile 参数是一个通讯设备的句柄,则该函数只刷新传输缓冲区

4. 如果 hFile 参数是一个以一个命名管道结尾的服务器句柄,则只有客户端从该管道读取了全部缓冲数据后,该函数才会返回


返回值:

1. 如果该函数运行成功,则返回值是非 0;

2. 如果该函数运行失败,则返回值是 0。

若想调用更多的错误信息,请调用 GetLastError 函数。

注意:如果 hFile 是一个控制输出的句柄,则该函数运行失败。那是因为控制输出是不用被缓冲的。该函数返回 FALSE,并且 GetLastError 函数返回 ERROR_INVALID_HANDLE。


备注:

1. 典型的情况是 WriteFile 和 WriteFileEx 函数将数据写入到内置缓冲区,然后操作系统定期写入到磁盘或者通讯管道。FlushFileBuffer 函数会将全部的缓冲信息写入到一个指定的设备或管道文件中。

2. 由于系统内硬盘的缓冲作用,当大量的写入操作正在被单独执行时,FlushFileBuffers 函数可能在每次写入一个硬盘驱动设备之后就不能使用了。如果一个应用正在对键盘进行多重写入操作并且还要确保关键数据被写入到了固定媒介中,那么这个应用应该用没有缓冲的 I/Q 来代替对 FlushFileBuffers 函数的频繁调用。想要以不带缓冲的 I/Q 方式打开一个文件,可通过调用带有 FILE_FLAG_NO_BUFFERING 和 FILE_FLAG_WRITE_THROUGH 标识的 CreateFile 函数来实现。这种方式能够防止文件内容被缓存,并且这种方式在每次写入时会刷新硬盘元数据。获取更多信息,请参照 CreateFile 函数。

3. 想要刷新在一个卷上全部打开的文件,可调用带有一个该卷句柄的 FlushFileBuffers 函数。并且调用方必须拥有管理权限。更多信息,请参照 Running with Special Privileges。

4. 当使用 CreatFile 函数打开一个卷时,ipFileName 字符串应该是下面的形式:\\.\x: 或者 \\?\Volume{GUID}。在卷名中不要用反斜线因为那代表一个驱动的根目录。

5. 在 Windows 8 和 Windows Server 2012 中,此功能由以下技术支持:


技术 是否支持
Server Message Block (SMB) 3.0 protocol 是
SMB 3.0 Transparent Failover (TFO) 是
SMB 3.0 with Scale-out File Shares (SO) 是
Cluster Shared Volume File System (CsvFS) 是
Resilient File System (ReFS) 是


需求:


Minimum supported client Windows XP [桌面应用程序 | Windows 商店应用程序]
Minimum supported server Windows 2003 服务器版 [桌面应用程序 | Windows 商店应用程序]
Minimum supported phone Windows Phone 8
Header FileAPI.h (包含于 Windows.h);
在 Windows Server 2008 R2, Windows 7, Windows Server 2008, Windows Vista, Windows Server 2003 和 Windows XP 上是 WinBase.h (包含于 Windows.h)
LibraryKernel32.lib
DLLKernel32.dll


【API档案】版权归鱼C工作室(www.fishc.com)所有,转载请注明来源。

页: [1]
查看完整版本: FlushFileBuffers