2008-09-27 18 views

Odpowiedz

12

Delphianie lubią podejście FindFirst (struktura SearchRec ma niektóre z nich), ale proponuję funkcję Win32 API GetFileAttributesEx.

13

Spróbuj

function FileAge(const FileName: string; out FileDateTime: TDateTime): Boolean; 

Od sysutils.

+0

Przestarzałe od czasu tego komentarza. –

+0

'FileAge()' pobiera datę utworzenia pliku, a nie datę OSTATNIO ZMODYFIKOWANĄ. –

+0

@JerryGagnon - Nie, używa '_WIN32_FILE_ATTRIBUTE_DATA.ftLastWriteTime' –

6

Z DSiWin32 darmowej biblioteki:

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 } 
+3

Dlaczego parametr var zamiast out - wydaje się, że nie używasz wartości, która jest dostępna? – Kohi

+1

Ważny punkt. Jestem programistą "starej szkoły", nauczyłem się go, zanim wynaleziono "out" i automatycznie używam "var" we wszystkich okazjach. – gabr

4

To powinno działać, i to jest natywny kod Delphi.

function GetFileModDate(filename : string) : integer; 
var 
    F : TSearchRec; 
begin 
    FindFirst(filename,faAnyFile,F); 
    Result := F.Time; 
    //if you wanted a TDateTime, change the return type and use this line: 
    //Result := FileDateToDatetime(F.Time); 
    FindClose(F); 
end; 
3
function GetFileModDate(filename : string) : TDateTime; 
var 
    F : TSearchRec; 
begin 
    FindFirst(filename,faAnyFile,F); 
    Result := F.TimeStamp; 
    //if you really wanted an Int, change the return type and use this line: 
    //Result := F.Time; 
    FindClose(F); 
end; 

F.Time został już przestarzałe Pomoc plik mówi Zastosowanie F.TimeStamp.
Po prostu zaktualizować to ze względu na nowsze wersje Delphi

0

System.IOUtils mają rekord TFile z kilkoma funkcjami do uzyskania wieku pliku, np. GetCreationTime, GetLastAccessTime, GetLastWriteTime

Powiązane problemy