Означает ли вызов CloseHandle для дескриптора файла, открытого для записи, также FlushFileBuffers?
Я столкнулся с кодом, похожим на этот (урезанный для 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 *)
где в Стандарте С явно указано, что буферы будут сброшены). Однако я не смог найти эту информацию в документации для CloseHandle
на MSDN.
Итак, это призыв к FlushFileBuffers
непосредственно перед закрытием дескриптора файла, необходимого, чтобы избежать отбрасывания буферизованного вывода?
1 ответ
Закрытие дескриптора не отменяет неосуществленные обновления, но также не сбрасывает их.
FlushFileBuffers
() полезно, если вы хотите выполнить принудительную очистку перед CloseHandle
() потому что последний не очищает буферы автоматически. Однако, если вам действительно нужны прямые записи, вы должны открыть ручку с FILE_FLAG_WRITE_THROUGH
,
Если вы не читаете прямую запись, то очистка не требуется ни перед закрытием ручки, ни в любой момент жизни ручки.