2014-10-12 92 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