2009-04-24 7 views
16

TFileStream fournit une sortie tamponnée, ce qui est génial dans la plupart des cas, mais dans certains cas (en particulier pendant le débogage), il est bon de vider le tampon immédiatement. Chose est, je ne connais pas de moyen de faire cela, sauf appel Free, ce qui est contre-productif.Comment vider un TFileStream?

Y a-t-il une meilleure façon de le faire?

Répondre

25

Vous devez vider le flux. Essayez:

FlushFileBuffers(fs.Handle); 

? Avez-vous vu/essayé cela?

6

Je pense que la réponse d'altCognito (FlushFileBuffers) est probablement la meilleure, mais seulement parce que TFileStream ne fait pas de tampon par lui-même. Pour les autres, les flux bufférisés doivent d'abord regarder si le flux offre une méthode Flush. Et en dernier recours, vous pourriez probablement utiliser le vieux truc de Seek (Begin) et ensuite Seek (CurrentPos).

6

C'est un peu impliqué, mais vous pouvez contrôler beaucoup de ce comportement dans l'appel à (win32 api) CreateFile. Vous pouvez ajouter FILE_FLAG_WRITE_THROUGH/FILE_FLAG_NO_BUFFERING ou même fournir des conseils d'optimisation au système de cache avec FILE_FLAG_SEQUENTIAL_SCAN ou FILE_FLAG_RANDOM_ACCESS. Pour utiliser TFileStream de cette façon, je pense que vous devez remplacer le Create pour modifier la façon dont il obtient le handle de fichier. FWIW, FlushFileBuffers est équivalent à Fermer/Ouvrir sur le fichier. Si vous faites beaucoup d'activité avec des flushs répétés, cela ralentira considérablement le code.

Un peu de documentation here

+5

En fait, vous n'avez pas besoin de redéfinir le constructeur. Il existe déjà une version surchargée, qui accepte un handle de fichier. Vous devez donc procéder comme suit (gestion des erreurs supprimée): FS: = TFileStream.Create (CreateFile (PChar (FileName), ..., FILE_FLAG_WRITE_THROUGH, ...)); C'est tout. Vraiment simple. – Alex

2

Utilisez-vous un TWriter/TReader ou tout simplement aller tout droit pour l'interface TFileStream? TReader et TWriter ont des tampons internes. Mais pour un flux de fichiers normal, les réponses ci-dessus l'ont trié. Personnellement, je mettrais en œuvre mon propre flux avec des méthodes pour y faire face directement.

Questions connexes