2009-04-24 12 views
16

TFileStream bietet eine gepufferte Ausgabe, was in den meisten Fällen sehr gut ist, aber in einigen Fällen (besonders beim Debugging) ist es sinnvoll, den Puffer sofort zu leeren. Die Sache ist, ich kenne keine Möglichkeit, das zu tun, außer Free zu nennen, was kontraproduktiv ist.Wie spült man einen TFileStream?

Gibt es einen besseren Weg, es zu tun?

Antwort

25

Sie müssen den Stream spülen. Versuchen Sie:

FlushFileBuffers(fs.Handle); 

? Hast du das gesehen/probiert?

6

Ich denke, dass die Antwort von AltCognito (FlushFileBuffers) wahrscheinlich die beste ist, aber nur weil TFileStream keine Pufferung selbst durchführt. Bei anderen gepufferten Streams sollte zuerst überprüft werden, ob der Stream eine Flush-Methode bietet. Und als letzten Ausweg könnten Sie wahrscheinlich den alten Trick von Seek (Begin) und Seek (CurrentPos) verwenden.

6

Es ist ein bisschen beteiligt, aber Sie können eine Menge dieses Verhaltens in der Aufruf von (Win32 API) CreateFile tatsächlich steuern. Sie können FILE_FLAG_WRITE_THROUGH/FILE_FLAG_NO_BUFFERING hinzufügen oder dem Cache-System Optimierungshinweise mit FILE_FLAG_SEQUENTIAL_SCAN oder FILE_FLAG_RANDOM_ACCESS geben. Um TFileStream auf diese Weise zu verwenden, müsste das Create überschrieben werden, um zu ändern, wie das Dateihandle abgerufen wird. FWIW, FlushFileBuffers entspricht einem Close/Open für die Datei. Wenn Sie viel Aktivität mit wiederholten Flushes machen, wird der Code erheblich verlangsamt.

Ein bisschen Dokumentation here

+5

Eigentlich müssen Sie den Konstruktor nicht überschreiben. Es gibt bereits eine überladene Version, die ein Datei-Handle akzeptiert. Sie müssen also wie folgt vorgehen (Fehlerbehandlung entfernt): FS: = TFileStream.Create (CreateFile (PChar (Dateiname), ..., FILE_FLAG_WRITE_THROUGH, ...)); Das ist alles. Wirklich einfach. – Alex

2

Verwenden Sie einen TWriter/TReader oder nur gerade für die TFileStream Schnittstelle gehen? TReader und TWriter haben interne Puffer. Aber für einen normalen Filestream haben die obigen Antworten es sortiert. Ich persönlich würde meinen eigenen Strom mit Methoden implementieren, um direkt damit umzugehen.