我遇到了与此类似的代码(针对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该缓冲区将被刷新)。但是,我无法在MSDN上的CloseHandle
文档中找到此信息。
那么,是否有必要在关闭文件句柄之前立即调用FlushFileBuffers
,以避免丢弃缓冲的输出?
答案 0 :(得分:3)
关闭句柄不会丢弃未刷新的更新,但也不会刷新它们。
如果要在FlushFileBuffers
()之前强制刷新,则 CloseHandle
()很有用,因为后者不会自动刷新缓冲区。但是,如果您确实需要直接写入,则必须使用FILE_FLAG_WRITE_THROUGH
打开句柄。
如果您不读直接写,则在关闭句柄之前或句柄寿命的任何时候都不需要进行冲洗。