我遇到了与此类似的代码(针对 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 标准明确记录了缓冲区将被刷新)。但是,我无法CloseHandle
在 MSDN 上的文档中找到此信息。
FlushFileBuffers
那么,为了避免丢弃缓冲的输出,在关闭文件句柄之前立即调用是否是必要的?