Pascal:从LPSYSTEMTIME记录中获取字段

时间:2012-09-05 23:21:52

标签: winapi record pascal

我正在使用Win32 api来获取文件的日期和时间。我有一个LPSYSTEMTIME结构,我正在尝试打印它的wYear变量。

我有一个函数(GetFileDate):

function GetFileDate : LPSYSTEMTIME
var
    CheckFile: Long;
    FileTime: LPFILETIME;
    FileTimeReturn: LPFILETIME;
    SystemTimeReturn: LPSYSTEMTIME;
begin
    CheckFile := CreateFile(PChar('main.pas'), GENERIC_READ, FILE_SHARE_READ, NIL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    GetFileTime(CheckFile, FileTime, NIL, NIL);
    FileTimeToLocalFileTime(FileTime, FileTimeReturn);
    FileTimeToSystemTime(FileTimeReturn, SystemTimeReturn);
    GetFileDate := SystemTimeReturn;
end;

但是当我这样做的时候......

begin
    Write(GetFileDate.wYear);
end.

吐了回来

main.pas(22,20) Error: Illegal qualifier
main.pas(22,20) Fatal: Syntax error, ")" expected but "identifier WYEAR" found
Fatal: Compilation aborted

对此有何帮助?

1 个答案:

答案 0 :(得分:2)

LPSYSTEMTIME是指向SYSTEMTIME结构的指针。尝试使用^运算符取消引用该指针,例如:

Write(GetFileDate^.wYear);

或者:

Write(GetFileDate()^.wYear);

除此之外,除了您根本没有进行任何错误处理这一事实外,您的GetFileDate()实现将错误的参数值传递给各种API函数。该代码甚至不应该编译,更不用说正确运行了。

请改为尝试:

function GetFileDate : SYSTEMTIME;
var 
  CheckFile: HANDLE; 
  FileTime: FILETIME; 
  FileTimeReturn: FILETIME; 
  SystemTimeReturn: SYSTEMTIME;
  GetFileDateResult: SYSTEMTIME;
begin 
  ZeroMemory(@GetFileDateResult, SizeOf(GetFileDateResult));
  CheckFile := CreateFile('FullPathTo\main.pas', GENERIC_READ, FILE_SHARE_READ, NIL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); 
  if CheckFile <> INVALID_HANDLE_VALUE then
  begin
    if GetFileTime(CheckFile, @FileTime, nil, nil) then
    begin
      if FileTimeToLocalFileTime(@FileTime, @FileTimeReturn) then
      begin
        if FileTimeToSystemTime(@FileTimeReturn, @SystemTimeReturn) then
          GetFileDateResult := SystemTimeReturn;
      end;
    end;
    CloseHandle(CheckFile);
  end; 
  GetFileDate := GetFileDateResult;
end; 

begin   
  Write(GetFileDate.wYear);   
end.

或者,我建议您使用FindFirstFile()代替CreateFile(),这样您就不必打开文件来获取日期。文件系统可以提供该信息,例如:

function GetFileDate : SYSTEMTIME;
var 
  CheckFile: HANDLE; 
  FindFileData: WIN32_FIND_DATA;
  FileTimeReturn: FILETIME; 
  SystemTimeReturn: SYSTEMTIME;
  GetFileDateResult: SYSTEMTIME;
begin 
  ZeroMemory(@GetFileDateResult, SizeOf(GetFileDateResult));
  CheckFile := FindFirstFile('FullPathTo\main.pas', @FindFileData);
  if CheckFile <> 0 then
  begin
    if FileTimeToLocalFileTime(@FindFileData.ftCreationTime, @FileTimeReturn) then
    begin
      if FileTimeToSystemTime(@FileTimeReturn, @SystemTimeReturn) then
        GetFileDateResult := SystemTimeReturn;
    end;
    FindClose(CheckFile);
  end; 
  GetFileDate := GetFileDateResult;
end;