2012-09-05 92 views
1

我使用Win32 API獲取文件的日期和時間。我有一個LPSYSTEMTIME結構,我試圖打印它的wYear變量。Pascal:從LPSYSTEMTIME記錄中獲取字段

我有一個函數(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 

對此有何幫助?

回答

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; 
+0

我其實已經試過了,但是它只是說在$ 75C58D46有運行時錯誤216。然後一些記憶垃圾。 –

+1

@SuperDisk:然後編輯您的問題併發布更多顯示'GetFileDate'的代碼。 –

+0

@kenWhite剛剛添加。 –