簡體   English   中英

Delphi-tfilestream:將時間和日期寫入文件

[英]Delphi - tfilestream: write time and date to file

我正在嘗試為每個事件保存一行,其中包含一段文本以及發生時的時間和日期。

問題是:

  1. 時間以中文字體顯示
  2. 一遍又一遍地替換同一行

這是代碼:

    uses sysUtils, classes;

function log: Boolean;
var
  fs: TFileStream;
  i : String;
  time : TDateTime;

begin
  i := 'Boss is dead!';
  time := now;
  try
    fs := TFileStream.Create('log.txt', fmCreate or fmOpenWrite);
    fs.Write(PChar(i +TimeToStr(time))^, Length(i +TimeToStr(time)));
    fs.write(i, sizeof(i));   
  finally
    fs.Free; 
  end;

end;

謝謝。

通常,當您希望看到拉丁文本但看到中文文本時,這意味着您將ANSI文本解釋為UTF-16。 由此推斷,您打算寫出UTF-16文本,但實際上是寫出ANSI文本。 這意味着您具有Unicode之前的Delphi。

至於為什么繼續覆蓋文件,那是因為您傳遞了fmCreate 您真正想做的是以寫模式打開現有文件,或者如果不存在文件,則創建一個新文件。 Win32 API函數通過OPEN_ALWAYS創建配置支持該功能。 但這不能通過TFileStream.Create 因此,您必須使用THandleStream並直接調用CreateFile 請注意,較新版本的Delphi引入了TFile.Open ,它公開了OPEN_ALWAYS功能。 但是我的推理是您使用的Delphi太舊了。

假設您可以使用THandleStream並正確調用CreateFile ,那么您只需要寫出UTF-16文本即可。 最簡單的方法是使用WideString 您可以這樣編寫代碼:

var
  ws: WideString;
....
Stream.Seek(0, soFromEnd);
ws := TimeToStr(Now) + sLineBreak;
Stream.WriteBuffer(PWideChar(ws)^, SizeOf(WideChar)*Length(ws));

另一方面,也許中國人來自這里:

fs.write(i, sizeof(i));

此代碼僅將指針寫入文件。 您確定不想這樣做,應該刪除該行。 為了完整起見,如果您有Unicode Delphi,那么您將以非常相似的方式編寫文本。 像這樣:

var
  s: string;
....
Stream.Seek(0, soFromEnd);
s := TimeToStr(Now) + sLineBreak;
Stream.WriteBuffer(PWideChar(s)^, SizeOf(WideChar)*Length(s));

返回追加到流,將像這樣運行:

var
  hFile: THandle;
....
hFile := CreateFile(
  PChar(LogFileName),
  GENERIC_WRITE,
  FILE_SHARE_READ,
  nil,
  OPEN_ALWAYS,
  FILE_ATTRIBUTE_NORMAL,
  0
);
Win32Check(hFile<>INVALID_HANDLE_VALUE);
Try
  Stream := THandleStream.Create(hFile);
  Try
    .... code to write to the stream goes here
  Finally
    Stream.Free;
  End;
Finally
  CloseHandle(hFile);
End;

最后,在這個答案中,我不得不對您的環境做出很多猜測。 將來,請始終包括您使用的Delphi版本。 並始終清楚地說明您的目標。

關於您的代碼,我需要更改幾件事。

  1. 您有一個應該返回布爾值的函數,但從未設置返回值。

  2. 這不是“錯誤”,但是變量i最常用作數組的整數索引或循環變量。 Delphi開發人員將討厭使用i作為字符串的代碼。

  3. 看來您只是在記錄文字。 TFileStream可能不是最好的方法。

我認為這是更干凈的代碼:

uses System.IoUtils;

...

FileName := 'log.txt';
LogLine  := 'Boss is dead '+TimeToStr(Now);

TFile.AppendAllText(FileName, LogLine);

http://docwiki.embarcadero.com/Libraries/XE7/en/System.IOUtils.TFile.AppendAllText

這個怎么樣:

uses SysUtils;

var s: AnsiString;

s := FormatDateTime('yyyy-mm-dd hh:nn:ss', now);
fs.Write(s[1], Length(s));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM