¿Cómo obtener las fechas de creación / última modificación de un archivo en Delphi?
Pregunta
Quiero obtener un archivo de estos atributos como valores enteros.
Solución
A los delphians les gusta el enfoque FindFirst (la estructura SearchRec tiene algunos de ellos), pero sugeriría la función de la API Win32 GetFileAttributesEx.
Otros consejos
Probar
function FileAge(const FileName: string; out FileDateTime: TDateTime): Boolean;
Desde SysUtils.
De la DSiWin32 biblioteca de programas gratuitos:
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 }
Esto debería funcionar, y es el código de Delphi nativo.
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;
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 ya ha sido desaprobado, el archivo de Ayuda dice Usar F.TimeStamp.
Solo para actualizar esto debido a versiones posteriores de Delphi
Puede llamar a la GetFileInformationByHandle función winapi. Aparently JCL tiene una función GetFileLastWrite que también podría usar
System.IOUtils tiene un registro TFile con varias funciones para obtener la antigüedad del archivo, por ejemplo. GetCreationTime, GetLastAccessTime, GetLastWriteTime