Reputation: 84540
TFileStream provides buffered output, which is great in most cases, but in some cases (especially during debugging) it's nice to flush the buffer immediately. Thing is, I don't know of any way to do that except calling Free, which is kind of counterproductive.
Is there a better way to do it?
Upvotes: 19
Views: 8106
Reputation: 4020
Are you using a TWriter/TReader or just going straight for the TFileStream interface? TReader and TWriter have internal buffers. But for a normal filestream then the replies above have it sorted. I personally would implement my own stream with methods to deal with it directly.
Upvotes: 2
Reputation: 884
It's a bit involved, but you can actually control a lot of that behavior in the call to (win32 api) CreateFile. You can add FILE_FLAG_WRITE_THROUGH
/ FILE_FLAG_NO_BUFFERING
or even provide optimization hints to the cache system with FILE_FLAG_SEQUENTIAL_SCAN
or FILE_FLAG_RANDOM_ACCESS
. To use TFileStream that way, I think you'd need to override the Create to change how it obtains the file handle. FWIW, FlushFileBuffers is equivalent to a Close/Open on the file. If you're doing a lot of activity with repeated flushes, it will slow the code down considerably.
A bit of documentation here
Upvotes: 7
Reputation: 273179
I think altCognito's answer (FlushFileBuffers) is probably the best, but only because TFileStream does no buffering by itself. For other, buffered, streams should first look if the stream offers a Flush method. And as a last resort you could probably use the old trick of Seek(Begin) and then Seek(CurrentPos).
Upvotes: 6
Reputation: 41381
You need to flush the stream. Try:
FlushFileBuffers(fs.Handle);
? Did you see/try this?
Upvotes: 30