有沒有一種方法,我可以使用編碼 Memo1.lines.savetofile('textfile1.txt')沒有它然後刪除任何已經在texfile保存備忘錄行?德爾福保存到文本文件
回答
想必您將文本追加到文件。做到這一點,像這樣:
TFile.AppendAllText(FileName, Memo1.Text);
它使用TFile
類從IOUtils
單元。如果您想對所用編碼進行控制,請傳遞編碼參數。
這個缺點是整個備忘錄內容必須存儲到內存中的臨時字符串中,然後再觸摸文件。並且該字符串必須轉換爲用於該文件的任何編碼。如果備忘錄中有大量文本,這可能會浪費大量內存(儘管是暫時的),並且運行緩慢。所以請注意這一點。 – 2014-10-12 16:49:42
@remy我期望這個表現很好。比逐行處理更好,因爲涉及的Windows消息有點貴。但肯定會有記憶成本。我懷疑速度會是一個問題。無論如何,編碼都需要處理。這段代碼的優點是它是一個簡單的單線程,非常易讀和簡潔。 – 2014-10-13 12:44:55
創建一個TFileStream
,打開現有文件,尋找流的結尾,然後將流傳遞到Memo1.Lines.SaveToStream()
。
從性能的角度來看,這段代碼與'TFile.AppendAllText'完全相同。這是因爲TMemoStrings.SaveToStream()實際上是基於'GetTextStr'的'TStrings.SaveToStream()'。更重要的是,正如所寫的,此代碼將發佈BOM。 – 2014-10-13 12:43:53
您可以通過向'SaveToStream()'提供無BOM的'TEncoding'來跳過正在輸出的BOM。例如,如果你想使用UTF-8,你可以在XE和更早的版本中使用'TEncoding.GetEncoding(65001)',或者從'TUTF8Encoding'派生並覆蓋XE2和之後的'GetPreamble()'。 'TMBCSEncoding'('GetEncoding()'返回)直到XE2才輸出BOM。 – 2014-10-14 00:10:48
實際上,使用名爲WriteBOM或類似的TStrings屬性是最簡單的。儘管如此,你沒有解決問題。您對另一個答案留下評論,指出它存在性能問題。但是這個答案中的代碼具有相同的性能問題。你解決這個問題似乎是公平的。 – 2014-10-14 06:04:55
- 1. 德爾福7 - 保存到一個特定的.INI文件名
- 2. 德爾福:ShellExecuteEx到.txt文件
- 3. 德爾福7德爾福XE2 res文件問題
- 4. 德爾福 - 保持Word文檔聚焦
- 5. 保存文件>與備註德爾福
- 6. 德爾福覆蓋保存對話框上的現有文件
- 7. TRichEdit上的RTF文本 - 德爾福2010
- 8. 德爾福XE:TDBMemo文本消失
- 9. 德爾福 - 查找文本大TMemo
- 10. 德爾福XE8錯誤閱讀從德爾福7版本創建的文本文件,反之亦然
- 11. 在德爾福錄音/保存
- 12. 德爾福XE5 - Android電子 - 保存
- 13. 德爾福:DBGrid選項不會保存?
- 14. 保存ComboBox項3,4德爾福
- 15. 德爾福的德文字符集
- 16. 德爾福:TJvChangeNotify/TShellChangeNotifier - 文件名
- 17. 德爾福 - 從FTP格式文件名
- 18. 德爾福ini文件VISTA/XP/WIN7
- 19. 異步文件I /德爾福
- 20. 德爾福2009年壓縮gzipped文件
- 21. 德爾福組合CSV文件編輯
- 22. 德爾福 - 獲取文件夾圖標
- 23. 德爾福:crypting資源文件
- 24. 德爾福XE8加載PDF文件
- 25. 德爾福7和EMF +文件
- 26. MemoryStream中的文件THandle(德爾福)
- 27. 德爾福和iPhone的PVR文件
- 28. 德爾福cfg文件路徑
- 29. 德爾福.res文件更換器
- 30. RestRequest下載文件德爾福XE7
是否要將備忘錄數據附加到現有文件,在保存數據之前創建現有文件的備份或提示用戶文件已存在,並且在這種情況下繼續/中止? – Lars 2014-10-12 13:24:50