Означает ли вызов CloseHandle для дескриптора файла, открытого для записи, также FlushFileBuffers? - PullRequest
0 голосов
/ 26 февраля 2019

Я столкнулся с кодом, похожим на этот (сокращено для 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 *), где явно задокументировано *1007* стандартом C, что буферы будут очищеныОднако я не смог найти эту информацию в документации для CloseHandle на MSDN.

Итак, необходим ли вызов FlushFileBuffers непосредственно перед закрытием дескриптора файла, необходимый дляизбежать отбрасывания буферизованного вывода?

1 Ответ

0 голосов
/ 26 февраля 2019

Закрытие дескриптора не отменяет неосуществленные обновления, но также не сбрасывает их.

FlushFileBuffers () полезно, если вы хотите принудительно сбросить до CloseHandle (), поскольку последний не очищает буферы автоматически.Однако, если вам действительно нужны прямые записи, вы должны открыть дескриптор с помощью FILE_FLAG_WRITE_THROUGH.

Если вы не читаете прямые записи, очистка не требуется ни перед закрытием дескриптора, нив любой момент жизни ручки.

...