Да, это потому, что процесс все еще записывает в файл, а буферы не сбрасываются.
Как правило, когда вы хотите записать в файл, вы можете (примерно) сделать что-то вроде этого:
1. Создайте/откройте файл и извлеките «канал» (дескриптор) к файлу.
2. Напишите что-нибудь
3. Очистить буфер/закрыть файл «канал» (дескриптор) (= зафиксировать на диске)
(затем повторите 1, 2 и 3, когда захотите написать что-то снова)
Однако делать что-то подобное можно, если вы хотите что-то написать время от времени, потому что «Открытие дескриптора файла» и «Очистка буферов» не являются «бесплатными», когда речь идет о производительности.
Это означает, что если вы планируете часто записывать в файл, лучше просто Создать/Открыть файл
, тогда Написать
несколько раз, по мере необходимости, и когда вы закончите Румянец
или закрыть дескриптор (в моем примере выше это означает 1
, 2
[повторить шаг 2
по мере необходимости], затем, позже, 3
)
И пока данные не сбрасываются на диск/коммитятся: на них нельзя полагаться!
Microsoft предоставляет более подробную информацию об этом:
Сброс данных ввода-вывода с системным буфером на диск
[...] Windows сохраняет данные операций чтения и записи файлов в буферах данных, поддерживаемых системой, для оптимизации производительности диска. Когда приложение записывает данные в файл, система обычно буферизует данные и регулярно записывает их на диск[...]
FlushFileBuffers Документ Windows API говорит:
[...] Обычно функции WriteFile и WriteFileEx записывают данные во внутренний буфер, который операционная система регулярно записывает на диск или канал связи. Функция FlushFileBuffers записывает всю буферизованную информацию для указанного файла в устройство или канал.
Из-за взаимодействия дискового кэширования внутри системы функция FlushFileBuffers может быть неэффективной при использовании после каждой записи на дисковое устройство, когда многие операции записи выполняются по отдельности.[...]
Создать файл документация:
[...] Когда приложение завершается с использованием дескриптора объекта, возвращенного CreateFile, используйте функцию CloseHandle, чтобы закрыть дескриптор. Это не только высвобождает системные ресурсы, но и может иметь более широкое влияние на такие вещи, как совместное использование файла или устройства и запись данных на диск. Подробности отмечаются в этой теме по мере необходимости.[...]
Больше информации о Кэширование файлов доступно здесь, Обратите внимание, что:
Метаданные файловой системы всегда кэшируются. Следовательно, чтобы сохранить любые изменения метаданных на диск, файл необходимо либо сбросить, либо открыть с помощью FILE_FLAG_WRITE_THROUGH.
Итак, как вы можете видеть, поведение зависит от дизайна приложения, нередко можно увидеть, что файлы журналов сбрасываются на диск только время от времени из соображений производительности, и вы не можете полагаться на метаданные, такие как дата/ время, размер файла или даже содержимое файла, пока приложение все еще записывает в файл.