Как очистить TFileStream?
-
16-09-2019 - |
Вопрос
TFileStream обеспечивает буферизованный вывод, что в большинстве случаев отлично, но в некоторых случаях (особенно во время отладки) полезно немедленно очистить буфер.Дело в том, что я не знаю другого способа сделать это, кроме вызова Free, что в некотором роде контрпродуктивно.
Есть ли лучший способ сделать это?
Решение
Вам нужно смыть поток.Пытаться:
FlushFileBuffers(fs.Handle);
?Вы видели/пробовали это?
Другие советы
Я думаю, что ответ altCognito (FlushFileBuffers), вероятно, лучший, но только потому, что TFileStream сам по себе не выполняет буферизацию.Для других буферизованных потоков следует сначала проверить, предлагает ли поток метод Flush.И в крайнем случае вы, вероятно, могли бы использовать старый прием: Seek(Begin), а затем Seek(CurrentPos).
Это немного сложно, но на самом деле вы можете контролировать большую часть этого поведения с помощью вызова (win32 api) CreateFile.Можете добавить FILE_FLAG_WRITE_THROUGH
/ FILE_FLAG_NO_BUFFERING
или даже предоставить подсказки по оптимизации для системы кэширования с помощью FILE_FLAG_SEQUENTIAL_SCAN
или FILE_FLAG_RANDOM_ACCESS
.Я думаю, чтобы использовать TFileStream таким образом, вам нужно переопределить Create, чтобы изменить способ получения дескриптора файла.Кстати, FlushFileBuffers эквивалентен операции закрытия/открытия файла.Если вы выполняете много действий с повторяющимися сбросами, это значительно замедлит работу кода.
Немного документации здесь
Вы используете TWriter/TReader или сразу переходите к интерфейсу TFileStream?TReader и TWriter имеют внутренние буферы.Но для обычного файлового потока ответы выше отсортированы.Лично я бы реализовал свой собственный поток с методами прямой работы с ним.