有没有一种方法,我可以使用编码 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德尔福XE2 res文件问题
- 2. 德尔福覆盖保存对话框上的现有文件
- 3. 德尔福 - 查找文本大TMemo
- 4. 德尔福XE8错误阅读从德尔福7版本创建的文本文件,反之亦然
- 5. 在德尔福录音/保存
- 6. 德尔福:DBGrid选项不会保存?
- 7. 德尔福的德文字符集
- 8. MemoryStream中的文件THandle(德尔福)
- 9. 德尔福2009年压缩gzipped文件
- 10. 德尔福:crypting资源文件
- 11. 德尔福7和EMF +文件
- 12. 德尔福和iPhone的PVR文件
- 13. 德尔福快速文件复制
- 14. 德尔福.res文件更换器
- 15. 德尔福 - 获取文件夹图标
- 16. 德尔福cfg文件路径
- 17. 德尔福XE8加载PDF文件
- 18. 从德尔福生产.obj文件
- 19. 德尔福2010年:如何将整个记录保存到文件?
- 20. 德尔福7编码修复文本文件
- 21. 随机文本文件德尔福来源或其他
- 22. 德尔福 - 共享违规打开文本文件
- 23. 德尔福二进制/文本文件必要性
- 24. 德尔福HID Delphi7和德尔福XE2
- 25. 德尔福v.Word - 如何从德尔福
- 26. WifiSignalStrength基本德尔福Converstion
- 27. 自动追加/从文本文件完成到编辑框德尔福
- 28. DES_KEY_SZ德尔福
- 29. 德尔福Application.HintColor
- 30. 德尔福
是否要将备忘录数据附加到现有文件,在保存数据之前创建现有文件的备份或提示用户文件已存在,并且在这种情况下继续/中止? – Lars 2014-10-12 13:24:50