2011-12-09 21 views

risposta

6

chiamare la funzione API di Windows SetFileTime. Passa a nil per lpLastAccessTime e a lpLastWriteTime se desideri solo modificare il tempo di creazione.

È necessario ottenere un handle di file chiamando lo CreateFile o uno dei wrapper Delphi, quindi questa non è l'API più conveniente da utilizzare.

Renditi la vita più semplice avvolgendo l'API call in una funzione helper che riceve il nome file e un TDateTime. Questa funzione dovrebbe gestire i dettagli di basso livello per ottenere e chiudere un handle di file e convertire lo TDateTime in uno FILETIME.

lo farei in questo modo:

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; 

ho dovuto aggiungere la dichiarazione di FILE_WRITE_ATTRIBUTES perché non è presente nell'unità Delphi 6 di Windows.

+0

Grazie mille !!!! – user1089764

7

Sulla base di FileSetDate, è possibile scrivere un analogo di routine:

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 !!!! Sei forte! Finalmente qualcosa che funziona! – user1089764