【发布时间】:2016-02-29 21:33:22
【问题描述】:
我想在 Delphi 中完成一项非常基本的任务:将字符串保存到磁盘并重新加载。这似乎微不足道,但自从我升级到 IOUtils 后,我在执行此操作两次时遇到了问题(在那之前还有一次......这就是为什么我做出升级到 IOUtils 的“绝妙”决定)。
我使用这样的东西:
procedure WriteToFile(CONST FileName: string; CONST uString: string; CONST WriteOp: WriteOperation);
begin
if WriteOp= (woOverwrite)
then IOUtils.TFile.WriteAllText (FileName, uString) //overwrite
else IOUtils.TFile.AppendAllText(FileName, uString); //append
end;
简单吧?会出什么问题?好吧,我最近遇到了 IOUtils 中的(另一个)错误。所以,TFile 是buggy。漏洞详解here。
任何人都可以分享不基于 IOUtils 并且已知有效的替代方案(或只是您的想法/想法)?嗯...上面的代码也为我工作了一段时间...所以,我知道很难保证一段代码(无论多么小)真的可以工作!
此外,我真的很希望我的 WriteToFile 过程在可能的情况下将字符串保存到 ANSI 文件(uString 仅包含 ANSI 字符),否则保存为 Unicode。
然后 ReadAFile 函数应该自动检测编码并正确读取字符串。
这个想法是仍然有文本编辑器会错误地打开/解释 Unicode/UTF 文件。所以,只要有可能,给用户一个好的旧 ANSI 文本文件。
所以:
- 覆盖/追加
- 尽可能保存为 ANSI
- 内存效率高(当要加载的文件为 2GB 时,不要吃 4GB 的内存)
- 应该适用于任何文本文件(显然最大 2GB)
- 没有 IOUtils(太难用了)
【问题讨论】:
-
关于IOUtils的一些更奇怪的事情:stackoverflow.com/questions/35429699/…stackoverflow.com/questions/31427260/…
-
TStringStream - 不是好主意,因为它不识别源文件编码,所以你可以加载错误的字符序列(默认编码 = Unicode)。并且它不会更改写入的编码,因此如果您将编码设置为 ANSI 以正确读取,则可以得到与另一个问题相同的异常
-
@kami:课程用马。
-
TEncoding.UTF8.GetBytes和TEncoding.UTF8.GetString。 FWIW,AppendAllText如果您的用户不会损坏手头的文件,则可以使用。 -
但这很重要。如果您需要处理附加到任意文件,那么解决方案将有所不同。无论如何,“我们都爱ANSI”。不,我们都讨厌它。没有单一的 ANSI。只是加载不同的代码页。那是比较没用的。 UTF-8 是我们的最爱。
标签: delphi unicode delphi-xe7