2014-10-12 102 views
1

有沒有一種方法,我可以使用編碼 Memo1.lines.savetofile('textfile1.txt')沒有它然後刪除任何已經在texfile保存備忘錄行?德爾福保存到文本文件

+0

是否要將備忘錄數據附加到現有文件,在保存數據之前創建現有文件的備份或提示用戶文件已存在,並且在這種情況下繼續/中止? – Lars 2014-10-12 13:24:50

回答

4

想必您將文本追加到文件。做到這一點,像這樣:

TFile.AppendAllText(FileName, Memo1.Text); 

它使用TFile類從IOUtils單元。如果您想對所用編碼進行控制,請傳遞編碼參數。

+2

這個缺點是整個備忘錄內容必須存儲到內存中的臨時字符串中,然後再觸摸文件。並且該字符串必須轉換爲用於該文件的任何編碼。如果備忘錄中有大量文本,這可能會浪費大量內存(儘管是暫時的),並且運行緩慢。所以請注意這一點。 – 2014-10-12 16:49:42

+0

@remy我期望這個表現很好。比逐行處理更好,因爲涉及的Windows消息有點貴。但肯定會有記憶成本。我懷疑速度會是一個問題。無論如何,編碼都需要處理。這段代碼的優點是它是一個簡單的單線程,非常易讀和簡潔。 – 2014-10-13 12:44:55

9

創建一個TFileStream,打開現有文件,尋找流的結尾,然後將流傳遞到Memo1.Lines.SaveToStream()

+0

從性能的角度來看,這段代碼與'TFile.AppendAllText'完全相同。這是因爲TMemoStrings.SaveToStream()實際上是基於'GetTextStr'的'TStrings.SaveToStream()'。更重要的是,正如所寫的,此代碼將發佈BOM。 – 2014-10-13 12:43:53

+0

您可以通過向'SaveToStream()'提供無BOM的'TEncoding'來跳過正在輸出的BOM。例如,如果你想使用UTF-8,你可以在XE和更早的版本中使用'TEncoding.GetEncoding(65001)',或者從'TUTF8Encoding'派生並覆蓋XE2和之後的'GetPreamble()'。 'TMBCSEncoding'('GetEncoding()'返回)直到XE2才輸出BOM。 – 2014-10-14 00:10:48

+0

實際上,使用名爲WriteBOM或類似的TStrings屬性是最簡單的。儘管如此,你沒有解決問題。您對另一個答案留下評論,指出它存在性能問題。但是這個答案中的代碼具有相同的性能問題。你解決這個問題似乎是公平的。 – 2014-10-14 06:04:55