2009-04-24 3 views
16

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

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

ответ

25

Вам необходимо очистить поток. Попыться:

FlushFileBuffers(fs.Handle); 

? Вы видели/пытались?

6

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

6

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

Немного документации here

+5

На самом деле, вам не нужно переопределять конструктор. Там уже есть перегруженная версия, которая принимает дескриптор файла. Итак, вы должны действовать следующим образом (обработка ошибок удалена): FS: = TFileStream.Create (CreateFile (PChar (FileName), ..., FILE_FLAG_WRITE_THROUGH, ...)); Вот и все. На самом деле просто. – Alex

2

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

 Смежные вопросы

  • Нет связанных вопросов^_^