gpt4 book ai didi

delphi - 我怎样才能让这个文件写入代码与 Unicode (Delphi) 一起使用

转载 作者:行者123 更新时间:2023-12-03 15:22:47 25 4
gpt4 key购买 nike

在转向 Unicode 和 Delphi 2009 之前,我有一些代码,每次将一些文本一行一行附加到日志文件中:

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 或更高版本中执行此操作?

<小时/>

结论:

瑞安的答案是最简单的,也是我找到解决方案的答案。使用他的解决方案,您还必须编写 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 行或更多),那么追加到文件的时间会越来越长,而且效率会变得相当低下。

所以我最终没有每次都重新创建和释放日志文件。相反,我将其保持打开状态,然后速度非常快。我似乎唯一不能做的就是允许在创建文件时使用记事本查看文件。

最佳答案

出于日志记录的目的,为什么要使用 Streams?

为什么不使用文本文件?这是我的日志记录例程的一个非常简单示例。

procedure LogToFile(Data:string);
var
wLogFile: TextFile;
begin
AssignFile(wLogFile, 'C:\MyTextFile.Log');
{$I-}
if FileExists('C:\MyTextFile.Log') then
Append(wLogFile)
else
ReWrite(wLogFile);
WriteLn(wLogfile, S);
CloseFile(wLogFile);
{$I+}
IOResult; //Used to clear any possible remaining I/O errors
end;

我实际上有一个相当广泛的日志记录单元,它使用关键部分来保证线程安全,可以选择通过 OutputDebugString 命令用于内部日志记录,以及通过使用部分标识符来记录指定的代码部分。

如果有人感兴趣,我很乐意在这里分享代码单元。

关于delphi - 我怎样才能让这个文件写入代码与 Unicode (Delphi) 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2137917/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com