delphi buffer flush tfilestream

delphi - ¿Cómo vaciar un TFileStream?



buffer flush (4)

TFileStream proporciona una salida con búfer, lo cual es excelente en la mayoría de los casos, pero en algunos casos (especialmente durante la depuración) es bueno vaciar el búfer inmediatamente. La cosa es que no conozco ninguna forma de hacerlo, excepto llamar a Free, que es contraproducente.

Hay una mejor manera de hacerlo?


¿Está utilizando un TWriter / TReader o simplemente va directo a la interfaz de TFileStream? TReader y TWriter tienen buffers internos. Pero para un flujo de archivos normal, las respuestas anteriores lo tienen ordenado. Personalmente implementaría mi propio flujo con métodos para tratar con él directamente.


Creo que la respuesta de altCognito (FlushFileBuffers) es probablemente la mejor, pero solo porque TFileStream no hace buffering por sí mismo. Para otros flujos, con búferes, primero se debe ver si el flujo ofrece un método de Descarga. Y como último recurso, probablemente puedas usar el viejo truco de Buscar (Comenzar) y luego Buscar (CurrentPos).


Es un poco complicado, pero en realidad puedes controlar gran parte de ese comportamiento en la llamada a (win32 api) CreateFile. Puedes agregar FILE_FLAG_WRITE_THROUGH / FILE_FLAG_NO_BUFFERING o incluso proporcionar sugerencias de optimización al sistema de caché con FILE_FLAG_SEQUENTIAL_SCAN o FILE_FLAG_RANDOM_ACCESS . Para usar TFileStream de esa manera, creo que deberías anular el Crear para cambiar la forma en que obtiene el identificador de archivo. FWIW, FlushFileBuffers es equivalente a un cierre / apertura en el archivo. Si está haciendo mucha actividad con descargas repetidas, el código disminuirá considerablemente.

Un poco de documentación here


Necesitas vaciar la corriente. Tratar:

FlushFileBuffers(fs.Handle);

? ¿Viste / probaste esto?