Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

 FlushFileBuffers(fs.Handle); 

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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