TFileStream提供緩衝輸出,這在大多數情況下都很棒,但在某些情況下(特別是在調試期間),立即刷新緩衝區很不錯。事情是,除了打電話給Free,我不知道有什麼辦法可以做到這一點,這種做法適得其反。如何刷新TFileStream?
有沒有更好的方法來做到這一點?
TFileStream提供緩衝輸出,這在大多數情況下都很棒,但在某些情況下(特別是在調試期間),立即刷新緩衝區很不錯。事情是,除了打電話給Free,我不知道有什麼辦法可以做到這一點,這種做法適得其反。如何刷新TFileStream?
有沒有更好的方法來做到這一點?
您需要刷新流。試試:
FlushFileBuffers(fs.Handle);
?你看到/嘗試過嗎?
我認爲altCognito的答案(FlushFileBuffers)可能是最好的,但只是因爲TFileStream本身沒有緩衝。對於其他緩衝的流,首先應該查看流是否提供Flush方法。作爲最後的手段,你可以使用Seek(Begin)和Seek(CurrentPos)這兩個老技巧。
這有點牽扯,但實際上可以在調用(win32 api)CreateFile時控制很多行爲。您可以添加FILE_FLAG_WRITE_THROUGH
/FILE_FLAG_NO_BUFFERING
,或者甚至通過FILE_FLAG_SEQUENTIAL_SCAN
或FILE_FLAG_RANDOM_ACCESS
向高速緩存系統提供優化提示。以這種方式使用TFileStream,我認爲你需要覆蓋Create來改變它如何獲得文件句柄。 FWIW,FlushFileBuffers相當於文件上的Close/Open。如果您正在進行大量重複沖洗的活動,則會顯着降低代碼的速度。
文件的位here
您使用的是TWriter /踏浪號或只是直行的TFileStream的界面? TReader和TWriter具有內部緩衝區。但對於一個普通的文件流,然後上面的回覆將它排序。我個人會用自己的方法直接處理它。
其實,你不需要重寫構造函數。已經有一個重載的版本,它接受一個文件句柄。因此,您必須按照以下步驟操作(刪除錯誤處理): FS:= TFileStream.Create(CreateFile(PChar(FileName),...,FILE_FLAG_WRITE_THROUGH,...)); 就是這樣。真的很簡單。 – Alex 2009-04-25 06:46:14