Как очистить TFileStream? - PullRequest
       17

Как очистить TFileStream?

16 голосов
/ 24 апреля 2009

TFileStream обеспечивает буферизованный вывод, который хорош в большинстве случаев, но в некоторых случаях (особенно во время отладки) хорошо очистить буфер немедленно. Дело в том, что я не знаю ни одного способа сделать это, кроме как назвать Free, что является своего рода контрпродуктивным.

Есть ли лучший способ сделать это?

Ответы [ 4 ]

27 голосов
/ 24 апреля 2009

Вам необходимо очистить поток. Попробуйте:

 FlushFileBuffers(fs.Handle); 

? Вы видели / пробовали это?

6 голосов
/ 25 апреля 2009

Это немного сложновато, но вы можете контролировать большую часть этого поведения в вызове (win32 api) CreateFile. Вы можете добавить FILE_FLAG_WRITE_THROUGH / FILE_FLAG_NO_BUFFERING или даже предоставить подсказки по оптимизации для системы кэширования с помощью FILE_FLAG_SEQUENTIAL_SCAN или FILE_FLAG_RANDOM_ACCESS. Чтобы использовать TFileStream таким образом, я думаю, вам нужно переопределить Create, чтобы изменить способ получения дескриптора файла. FWIW, FlushFileBuffers эквивалентен закрытию / открытию файла. Если вы выполняете много действий с повторяющимися сбросами, это значительно замедлит код.

Немного документации здесь

6 голосов
/ 24 апреля 2009

Я думаю, что ответ altCognito (FlushFileBuffers), вероятно, лучший, но только потому, что TFileStream сам по себе не выполняет буферизацию. Для других буферизованных потоков сначала нужно посмотреть, предлагает ли поток метод Flush. И в крайнем случае вы можете использовать старый трюк Seek (Begin), а затем Seek (CurrentPos).

2 голосов
/ 12 мая 2011

Вы используете TWriter / TReader или просто идете прямо к интерфейсу TFileStream? TReader и TWriter имеют внутренние буферы. Но для нормального файлового потока в ответах выше он отсортирован. Я лично реализовал бы свой собственный поток с методами, чтобы иметь дело с этим непосредственно.

...