我遇到了类似的代码(针对 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/