我有一些代码之前,我搬到了Unicode和德尔福2009年,在一次追加一些文本到一个日志文件中的行:我怎样才能得到这个文件编写代码使用Unicode(德尔福)工作
procedure AppendToLogFile(S: string);
// this function adds our log line to our shared log file
// Doing it this way allows Wordpad to open it at the same time.
var F, C1 : dword;
begin
if LogFileName <> '' then begin
F := CreateFileA(Pchar(LogFileName), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_ALWAYS, 0, 0);
if F <> 0 then begin
SetFilePointer(F, 0, nil, FILE_END);
S := S + #13#10;
WriteFile(F, Pchar(S)^, Length(S), C1, nil);
CloseHandle(F);
end;
end;
end;
但是CreateFileA和WriteFile是binary file handlers and are not appropriate for Unicode。
我需要在Delphi 2009下做一些相应的工作,并且能够处理Unicode。
我打开并写入文件然后关闭每行的文件的原因很简单,以便其他程序(如写字板)可以在写入日志时打开文件并读取它。
我一直在使用TFileStream和TextWriter进行实验,但是他们和几个例子的文档都很少。
具体而言,我不确定它们是否适合于这种不断打开和关闭文件。此外,我不确定他们是否可以在文件打开时使文件可供阅读。
有谁知道我在Delphi 2009或更高版本中如何做到这一点?
结论:
Ryan的回答是最简单,一个是导致我我的解决方案。有了他的解决方案,您还必须编写BOM并将字符串转换为UTF8(正如我在他的回答中的评论),然后工作得很好。
但后来我又走了一步,调查了TStreamWriter。这相当于同名的.NET函数。它了解Unicode并提供非常干净的代码。
我最后的代码是:
procedure AppendToLogFile(S: string);
// this function adds our log line to our shared log file
// Doing it this way allows Wordpad to open it at the same time.
var F: TStreamWriter;
begin
if LogFileName <> '' then begin
F := TStreamWriter.Create(LogFileName, true, TEncoding.UTF8);
try
F.WriteLine(S);
finally
F.Free;
end;
end;
最后,其他方面我发现是,如果你附加了很多线(例如1000以上),则附加到文件需要更长的时间和更长它变得相当低效。
所以我最终没有重新创建和释放LogFile每次。相反,我保持开放,然后它非常快。我似乎无法做的唯一事情就是允许在创建时使用记事本查看文件。
我测试了你的AppendToLogFile和我的两个(非UTF和UTF),并没有看到一个显着的蠕变,因为日志被追加到更大。我想知道为什么。有任何想法吗?一个10-20字节的字符串10K增加大约需要2.4秒,我尝试了所有三个实现。 – 2010-01-27 14:19:52
如果我保留全局TStreamWriter而不是创建并释放它,我的2.4秒会下降到93毫秒。哇。好吧,从现在开始我就是这么做的。好的提示。 – 2010-01-27 14:26:18
@ lkessler-另请参阅此替代方法:http://stackoverflow.com/questions/35710087/how-to-save-classic-delphi-string-to-disk-and-read-them-back/36106740#36106740 – Ampere 2016-03-19 20:45:20