2011-12-09 12 views

Odpowiedz

6

Wywołanie funkcji API SetFileTime systemu Windows. Przekaż nil dla lpLastAccessTime i lpLastWriteTime, jeśli chcesz zmodyfikować czas utworzenia.

Konieczne będzie uzyskanie uchwytu pliku przez wywołanie CreateFile lub jednego z wrapperów Delphi, więc nie jest to najwygodniejszy interfejs API do użycia.

Ułatw sobie życie, zawijając wywołanie API w funkcji pomocnika, która odbiera nazwę pliku i TDateTime. Ta funkcja powinna zarządzać niskopoziomowymi szczegółami uzyskiwania i zamykania uchwytu pliku oraz przekształcania TDateTime w FILETIME.

zrobiłbym to tak:

const 
    FILE_WRITE_ATTRIBUTES = $0100; 

procedure SetFileCreationTime(const FileName: string; const DateTime: TDateTime); 
var 
    Handle: THandle; 
    SystemTime: TSystemTime; 
    FileTime: TFileTime; 
begin 
    Handle := CreateFile(PChar(FileName), FILE_WRITE_ATTRIBUTES, 
    FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 
    FILE_ATTRIBUTE_NORMAL, 0); 
    if Handle=INVALID_HANDLE_VALUE then 
    RaiseLastOSError; 
    try 
    DateTimeToSystemTime(DateTime, SystemTime); 
    if not SystemTimeToFileTime(SystemTime, FileTime) then 
     RaiseLastOSError; 
    if not SetFileTime(Handle, @FileTime, nil, nil) then 
     RaiseLastOSError; 
    finally 
    CloseHandle(Handle); 
    end; 
end; 

musiałem dodać deklarację FILE_WRITE_ATTRIBUTES ponieważ nie jest obecny w jednostce Delphi 6 Windows.

+0

Dziękuję bardzo! – user1089764

7

podstawie FileSetDate, można napisać podobny rutyna:

function FileSetCreatedDate(Handle: Integer; Age: Integer): Integer; 
var 
    LocalFileTime, FileTime: TFileTime; 
begin 
    Result := 0; 
    if DosDateTimeToFileTime(LongRec(Age).Hi, LongRec(Age).Lo, LocalFileTime) and 
    LocalFileTimeToFileTime(LocalFileTime, FileTime) and 
    SetFileTime(Handle, @FileTime, nil, nil) then Exit; 
    Result := GetLastError; 
end; 
+0

Yeahhhh !!!! Rządzisz! Nareszcie coś, co działa! – user1089764

Powiązane problemy