2009-04-24 18 views
16

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

¿Hay una mejor manera de hacerlo?

Respuesta

25

Necesita enjuagar la corriente. Pruebe:

FlushFileBuffers(fs.Handle); 

? ¿Has visto/probado esto?

6

Creo que la respuesta de altCognito (FlushFileBuffers) es probablemente la mejor, pero solo porque TFileStream no hace búfer por sí mismo. En el caso de otras transmisiones en búfer, primero debe observar si la transmisión ofrece un método de Descarga. Y, como último recurso, probablemente puedas usar el viejo truco de Buscar (Comenzar) y luego Buscar (Puestos Actuales).

6

Es un poco complicado, pero en realidad se puede controlar gran parte de ese comportamiento en la llamada a (win32 api) CreateFile. Puede agregar FILE_FLAG_WRITE_THROUGH/FILE_FLAG_NO_BUFFERING o incluso proporcionar sugerencias de optimización para el sistema de caché con FILE_FLAG_SEQUENTIAL_SCAN o FILE_FLAG_RANDOM_ACCESS. Para usar TFileStream de esa manera, creo que necesitaría anular Create para cambiar la forma en que obtiene el identificador de archivo. FWIW, FlushFileBuffers es equivalente a Cerrar/Abrir en el archivo. Si está realizando una gran actividad con repetidos bochornos, reducirá considerablemente la velocidad del código.

Un poco de documentación here

+5

En realidad, no es necesario que anule el constructor. Ya hay una versión sobrecargada, que acepta un identificador de archivo. Por lo tanto, debe proceder de la siguiente manera (se elimina el manejo del error): FS: = TFileStream.Create (CreateFile (PChar (FileName), ..., FILE_FLAG_WRITE_THROUGH, ...)); Eso es todo. Realmente simple – Alex

2

¿Está utilizando un TWriter/pisador o simplemente ir directamente a la interfaz de TFileStream? TReader y TWriter tienen búferes internos. Pero para una secuencia de archivos normal, las respuestas anteriores lo han ordenado. Personalmente implementaría mi propia corriente con métodos para tratarla directamente.

Cuestiones relacionadas