Вопрос

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 имеют внутренние буферы.Но для обычного файлового потока ответы выше отсортированы.Лично я бы реализовал свой собственный поток с методами прямой работы с ним.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top