2011-12-09 19 views

Respuesta

6

Llame a la función API de Windows SetFileTime. Pase nil para lpLastAccessTime y lpLastWriteTime si solo desea modificar la hora de creación.

Necesitará obtener un identificador de archivo llamando al CreateFile, o uno de los envoltorios de Delphi, por lo que esta no es la API más conveniente de usar.

Haga la vida más fácil al envolver la llamada API en una función de ayuda que recibe el nombre de archivo y TDateTime. Esta función debe gestionar los detalles de bajo nivel para obtener y cerrar un identificador de archivo y convertir el TDateTime en un FILETIME.

lo haría así:

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; 

he tenido que añadir la declaración de FILE_WRITE_ATTRIBUTES porque no está presente en la unidad de Delphi 6 de Windows.

+0

¡Muchas gracias! – user1089764

7

Basado en FileSetDate, puede escribir una rutina similar:

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 !!!! ¡Rock! ¡Finalmente algo que funciona! – user1089764

Cuestiones relacionadas