Delphi保存到文本文件

Delphi保存到文本文件,delphi,Delphi,有没有一种方法可以使用编码 Memo1.lines.savetofile('textfile1.txt')不包含它,然后删除texfile中已有的内容以保存备忘录行 您可能希望将文本附加到文件中。这样做: TFile.AppendAllText(FileName, Memo1.Text); 这将使用IOUtils单元中的类。如果要对使用的编码进行控制,请传递编码参数 您可能希望将文本附加到文件中。这样做: TFile.AppendAllText(FileName, Memo1.Text);

有没有一种方法可以使用编码
Memo1.lines.savetofile('textfile1.txt')不包含它,然后删除texfile中已有的内容以保存备忘录行

您可能希望将文本附加到文件中。这样做:

TFile.AppendAllText(FileName, Memo1.Text);

这将使用
IOUtils
单元中的类。如果要对使用的编码进行控制,请传递编码参数

您可能希望将文本附加到文件中。这样做:

TFile.AppendAllText(FileName, Memo1.Text);

这将使用
IOUtils
单元中的类。如果要对使用的编码进行控制,请传递编码参数

创建一个打开现有文件的
TFileStream
,查找到流的结尾,然后将流传递到
Memo1.Lines.SaveToStream()

创建一个打开现有文件的
TFileStream
,查找到流的结尾,然后将流传递到
Memo1.Lines.SaveToStream())

是否要将备忘录数据附加到现有文件中,在保存数据之前创建现有文件的备份,或提示用户文件已存在,在这种情况下继续/中止?是否要将备忘录数据附加到现有文件中,在保存数据之前创建现有文件的备份,或提示用户文件已经存在,在这种情况下继续/中止?缺点是,在触摸文件之前,必须将整个备忘录内容存储到内存中的临时字符串中。并且该字符串必须转换为文件使用的任何编码。这可能会浪费大量内存(尽管是暂时的),如果备忘录中有大量文本,则运行速度会很慢。所以小心点。@remy我希望这部电影的表现会很好。比逐行处理要好,因为涉及的Windows消息有点贵。但肯定会有内存成本。我怀疑速度会是个问题。无论发生什么情况,都需要处理编码。这段代码的优点是它是一个简单的单行程序,因此可读性和简洁性很强。缺点是,在触摸文件之前,必须将整个备忘录内容存储到内存中的临时字符串中。并且该字符串必须转换为文件使用的任何编码。这可能会浪费大量内存(尽管是暂时的),如果备忘录中有大量文本,则运行速度会很慢。所以小心点。@remy我希望这部电影的表现会很好。比逐行处理要好,因为涉及的Windows消息有点贵。但肯定会有内存成本。我怀疑速度会是个问题。无论发生什么情况,都需要处理编码。这段代码的优点是它是一个简单的单行程序,因此可读性和简洁性都很高。了解这段代码在性能方面与
TFile.AppendAllText
相同可能会很有趣。这是因为
TMemoStrings.SaveToStream()
实际上是基于
GetTextStr
TStrings.SaveToStream()
。此外,如前所述,此代码将生成一个BOM。您可以通过提供一个无BOM的
TEncoding
SaveToStream()
跳过正在输出的BOM。例如,如果您想要UTF-8,可以在XE和更早版本中使用
TEncoding.GetEncoding(65001)
,或者在XE2和更高版本中从
TUTF8Encoding
派生并覆盖
GetPreamble()
TMBCSEncoding
(其中
GetEncoding()
返回)直到XE2才输出BOM。实际上,最简单的方法是使用TStrings属性,名为WriteBOM或类似属性。不过,您没有提到性能问题。您在另一个答案上留下了一条评论,指出它存在性能问题。但是这个答案中的代码有同样的性能问题。您解决这个问题似乎是公平的。从性能角度来看,这段代码与
TFile.AppendAllText
相同,这可能会很有趣。这是因为
TMemoStrings.SaveToStream()
实际上是基于
GetTextStr
TStrings.SaveToStream()
。此外,如前所述,此代码将生成一个BOM。您可以通过提供一个无BOM的
TEncoding
SaveToStream()
跳过正在输出的BOM。例如,如果您想要UTF-8,可以在XE和更早版本中使用
TEncoding.GetEncoding(65001)
,或者在XE2和更高版本中从
TUTF8Encoding
派生并覆盖
GetPreamble()
TMBCSEncoding
(其中
GetEncoding()
返回)直到XE2才输出BOM。实际上,最简单的方法是使用TStrings属性,名为WriteBOM或类似属性。不过,您没有提到性能问题。您在另一个答案上留下了一条评论,指出它存在性能问题。但是这个答案中的代码有同样的性能问题。你解决这个问题似乎很公平。