歡迎光臨 Code²

Code Square, CodeSqaure, Pascal, Javascript

2009年4月30日星期四

取得檔案最後修改時間

  要知道一個檔案文件是否曾被修改,一個方便的方法是看看它的最後修改日期,Delphi提供了兩個和文件日期有關的函數:FileAgeFileGetDate,但是它們返回的都是文件建立的時間而不是最後修改的時間。

  Windows中每一個文件有三個時間屬性,建立時間、最後打開時間和最後修改時間,可以用下列函數取得:

function  TFileTime2DateTime(Time: TFileTime): tDatetime;
var
  LocalTime: TFileTime;
  DosTime: Integer;
begin
  FileTimeToLocalFileTime(Time, LocalTime);
  FileTimeToDosDateTime(LocalTime, LongRec(DosTime).Hi, LongRec(DosTime).Lo);
  Result:=FileDateToDateTime(DosTime);
end;

function  DateTime2TFileTime(Time: tDatetime): TFileTime;
var
  LocalTime: TFileTime;
  DosTime: Integer;
begin
  DosTime:=DateTimeToFileDate(Time);
  DosDateTimeToFileTime(LongRec(DosTime).Hi, LongRec(DosTime).Lo, LocalTime);
  LocalFileTimeToFileTime(LocalTime, Result);
end;

function  GetFileCreationTime(const filename:string): tdatetime;
var
  hFile: THandle;
  FileTime: TFileTime;
begin
  hFile:=FileOpen(filename, fmOpenRead);
  try
    GetFileTime(hFile, @FileTime, nil, nil);
    Result:=TFileTime2DateTime(FileTime);
  finally
    FileClose(hFile);
  end;
end;

function  GetFileLastAccessTime(const filename:string): tdatetime;
var
  hFile: THandle;
  FileTime: TFileTime;
begin
  hFile:=FileOpen(filename, fmOpenRead);
  try
    GetFileTime(hFile, nil, @FileTime, nil);
    Result:=TFileTime2DateTime(FileTime);
  finally
    FileClose(hFile);
  end;
end;

function  GetFileLastWriteTime(const filename:string): tdatetime;
var
  hFile: THandle;
  FileTime: TFileTime;
begin
  hFile:=FileOpen(filename, fmOpenRead);
  try
    GetFileTime(hFile, nil, nil, @FileTime);
    Result:=TFileTime2DateTime(FileTime);
  finally
    FileClose(hFile);
  end;
end;

2009年4月29日星期三

复制中文文字到剪貼板

在Delphi中把文字复制到剪貼板是很容易的,只要Uses clipbrd;後設定Clipboard.AsText即可,但是如果文字中使用了非ASCII字元,在不同語言的系統中將出現亂碼,解決的方法是复制時說明文字的編碼:

procedure CopyToClipboard(const s: string; LocaleID: LCID = $0404);
var
  MemHandle: HGLOBAL;
  P: ^LCID;
begin
  if s='' then exit;
  with Clipboard do
  begin
    MemHandle:=GlobalAlloc(GMEM_MOVEABLE+GMEM_DDESHARE, sizeof(LCID));
    if MemHandle <> 0 then
    begin
      p:=GlobalLock(MemHandle);
      p^:=LocaleID;
      GlobalUnlock(MemHandle);
      Open;
      try
        AsText := s;
        SetAsHandle(CF_Locale, MemHandle);
      finally
        Close;
      end;
    end else astext:=s;
  end;
end;
當然,也可以使用Unicode:
procedure CopyToClipBoardw(const ws: widestring);
var
  MemHandle: HGLOBAL;
  ptr: ^LCID;
begin
  MemHandle := GlobalAlloc(GMEM_MOVEABLE+GMEM_DDESHARE, 2*length(ws)+2);
  if MemHandle <> 0 then
  begin
    ptr:=GlobalLock(MemHandle);
    Move(PWideChar(ws)^, ptr^, 2*length(ws)+2);
    GlobalUnlock(MemHandle);
    Clipboard.SetAsHandle(CF_UNICODETEXT, MemHandle);
  end;
end;