调用文件句柄上的CloseHandle是否打开写入暗示FlushFileBuffers?

问题描述 投票:1回答:1

我遇到了与此类似的代码(为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以避免丢弃缓冲输出?

c winapi handle io-buffering
1个回答
3
投票

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

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

如果您没有读取直接写入,则无需在关闭手柄之前或在手柄寿命的任何时刻进行冲洗。

© www.soinside.com 2019 - 2024. All rights reserved.