c - 在打开的文件句柄上调用 CloseHandle 是否也意味着 FlushFileBuffers?

标签 c winapi handle io-buffering

我遇到了类似的代码(针对 MCVE 进行了精简):

HANDLE hFile = CreateFileW(argv[1], GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
    FILE_ATTRIBUTE_NORMAL, NULL); 
// Note: FILE_FLAG_NO_BUFFERING and FILE_FLAG_WRITE_THROUGH are not present
DWORD dwWritten;

WCHAR wBOM = 0xFEFF, wString[100] = L"Hello World!";

SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
WriteFile(hFile, &wBOM, sizeof(WCHAR), &dwWritten, NULL);
WriteFile(hFile, wString, wcslen(wString) * sizeof(WCHAR), &dwWritten, NULL);

FlushFileBuffers(hFile);
CloseHandle(hFile);

最后一部分让我觉得很迂腐,因为我的印象是调用 CloseHandle 会将任何缓冲输出刷新到磁盘(类似于 fclose(FILE *),它在那里缓冲区将被刷新的 C 标准是 explicitly documented。但是,我无法在 CloseHandle 的文档中找到此信息。在 MSDN 上。

那么,在关闭文件句柄之前立即调用 FlushFileBuffers 是否有必要避免丢弃缓冲输出?

最佳答案

关闭句柄不会丢弃未刷新的更新,但也不会刷新它们。

FlushFileBuffers () 如果您想在 CloseHandle 之前强制刷新,则很有用() 因为后者不会自动刷新缓冲区。然而,如果你真的需要直接写,你必须用FILE_FLAG_WRITE_THROUGH打开句柄。 .

如果您不读取直接写入,则在关闭句柄之前或句柄生命周期的任何时候都不需要刷新。

关于c - 在打开的文件句柄上调用 CloseHandle 是否也意味着 FlushFileBuffers?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54874799/

相关文章:

c - 向不透明句柄添加 const-ness

C# 在桌面图标后面设置窗口

c - RECT 结构的右边缘和下边缘是否在所有 Windows API 函数中被视为独占?

c - 我在 do/while 循环中有一段时间,但它仍然告诉我我没有

c - 使用函数 CreateFile(..) 在 C 中打开串行 RS232 端口

c - c中switch case中的逻辑运算符

c - 在 KeyPress 上关闭 MessageBox?

c++ - C++ 的 RSA 加密库

c++ - 我如何编写当前程序以将命令输入到 C++ 中的另一个控制台?

java - 访问 Swing JSlider 的拇指/ handle /旋钮