1

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

これについて何か助けはありますか?

4

1 に答える 1

2

LPSYSTEMTIMESYSTEMTIME構造体へのポインタです。^演算子を使用してそのポインターを逆参照してみてください。

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; 
于 2012-09-06T00:31:38.780 に答える