Ответ 1
Вам нужно очистить поток. Попробуйте:
FlushFileBuffers(fs.Handle);
? Вы видели/пытались это сделать?
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, чтобы изменить способ получения дескриптора файла. FWIW, FlushFileBuffers эквивалентно закрытию/открытию файла. Если вы много работаете с повторными флешами, это значительно замедлит код.
Немного документации здесь
Используете ли вы TWriter/TReader или просто отправляетесь прямо в интерфейс TFileStream? TReader и TWriter имеют внутренние буферы. Но для нормального filestream ответы выше были отсортированы. Я лично буду реализовывать свой собственный поток с помощью методов, чтобы иметь дело с ним напрямую.