2009-07-03 75 views
0

我目前使用以下準則來獲取文件的「的LastAccessTime」德爾福 http://www.latiumsoftware.com/en/delphi/00007.php獲取的LastAccessTime德爾福

使用FindNext中,可以使用一個TSearchRec對象從中我可以訪問ftLastWriteTime它的類型是TFileTime

當將其轉換爲TDateTime對象(使用上面的源代碼),然後輸出DateTimeToString我得到的日期和時間,但小時似乎是兩個數字在文件ftLastWriteTime小時值的總和。

即不但得不到2009/09/03 13:45我得到2009/09/03 04:45或 代替2009/09/03 17:45我得到2009/09/03 08:45

如有任何意見,歡迎提前致謝

回答

1

典型的,20分鐘後,我的第一篇文章,我解決了我自己的問題。

筆者到鏈接代碼avbove有相同的代碼的兩個版本,第二個是這裏發佈http://www.latiumsoftware.com/en/delphi/00051.php

問題解決了! - 我認爲DOS庫對Win32時間戳的解釋是不正確的,並且被延續到後面的代碼中。也許不會?如果時間允許,我會進一步調查。

1

時間戳是UTC,而不是當地時間。

5

「像往常一樣」;-)我會指向DSiWin32其中包括函數DSiGetFileTimes,它返回創建時間,上次訪問時間和上次修改時間。

function DSiFileTimeToDateTime(fileTime: TFileTime; var dateTime: TDateTime): boolean; 
var 
    sysTime: TSystemTime; 
begin 
    Result := FileTimeToSystemTime(fileTime, sysTime); 
    if Result then 
    dateTime := SystemTimeToDateTime(sysTime); 
end; { DSiFileTimeToDateTime } 

function DSiGetFileTimes(const fileName: string; var creationTime, lastAccessTime, 
    lastModificationTime: TDateTime): boolean; 
var 
    fileHandle   : cardinal; 
    fsCreationTime  : TFileTime; 
    fsLastAccessTime  : TFileTime; 
    fsLastModificationTime: TFileTime; 
begin 
    Result := false; 
    fileHandle := CreateFile(PChar(fileName), GENERIC_READ, FILE_SHARE_READ, nil, 
    OPEN_EXISTING, 0, 0); 
    if fileHandle <> INVALID_HANDLE_VALUE then try 
    Result := 
     GetFileTime(fileHandle, @fsCreationTime, @fsLastAccessTime, 
     @fsLastModificationTime) and 
     DSiFileTimeToDateTime(fsCreationTime, creationTime) and 
     DSiFileTimeToDateTime(fsLastAccessTime, lastAccessTime) and 
     DSiFileTimeToDateTime(fsLastModificationTime, lastModificationTime); 
    finally 
    CloseHandle(fileHandle); 
    end; 
end; { DSiGetFileTimes }