У меня был какой-то код, прежде чем я перешел на 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 являются обработчиками двоичных файлов и не подходят для Unicode .
Мне нужно что-то сделать, чтобы сделать эквивалент в Delphi 2009 и уметь обрабатывать Unicode.
Причина, по которой я открываю и пишу, а затем закрываю файл для каждой строки, заключается просто в том, что другие программы (например, WordPad) могут открывать файл и читать его во время записи журнала.
Я экспериментировал с TFileStream и TextWriter, но по ним очень мало документации и мало примеров.
В частности, я не уверен, подходят ли они для этого постоянного открытия и закрытия файла. Также я не уверен, смогут ли они сделать файл доступным для чтения, пока они открыты для записи.
Кто-нибудь знает, как я могу сделать это в Delphi 2009 или более поздней версии?
Вывод:
Ответ Райана был самым простым и тот, который привел меня к моему решению. С его решением вы также должны написать спецификацию и преобразовать строку в 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 каждый раз. Вместо этого я держу это открытым, и тогда это очень быстро. Единственное, что я не могу сделать, это разрешить просмотр файла с помощью блокнота во время его создания.