Skip to content

Instantly share code, notes, and snippets.

@artem78
Created September 7, 2023 06:35
Show Gist options
  • Save artem78/68f36ef316620cf80c8031b156fce019 to your computer and use it in GitHub Desktop.
Save artem78/68f36ef316620cf80c8031b156fce019 to your computer and use it in GitHub Desktop.
Set/get file creation/modification time in Free Pascal
program FileDate;
{$Mode objfpc}{$H+}
uses
{$IfDef Windows}
Windows,
{$EndIf}
SysUtils, Classes, DateUtils, FileUtil;
function FileCreatedTime(const AFileName: String): TDateTime;
{$IfDef Windows}
// Source: https://www.cyberforum.ru/post10364301.html
var
t1:TFILETIME;
t2:TSYSTEMTIME;
sr:TSearchRec;
begin
Result := 0;
if FindFirst(AFileName,faAnyFile,sr)=0 then begin
FileTimeToLocalFileTime(sr.FindData.ftCreationTime,t1);
FileTimeToSystemTime(t1,t2);
Result := SystemTimeToDateTime(t2);
end;
end;
{$EndIf}
function FileModifiedTime(const AFileName: String): TDateTime; inline;
begin
Result := FileDateToDateTime(FileAge(AFileName));
end;
procedure SetFileModifiedTime(const AFileName: String; ATime: TDateTime);
begin
FileSetDate(AFileName, DateTimeToFileDate(ATime));
end;
procedure SetFileCreatedTime(const AFileName: String; ATime: TDateTime);
{$IfDef Windows}
// Source: https://forum.lazarus.freepascal.org/index.php/topic,25541.msg155322.html#msg155322
var
fileHandle: THandle;
fileTime: TFILETIME;
LFileTime: TFILETIME;
LSysTime: TSystemTime;
begin
//Result:=False;
try
DecodeDate(ATime, LSysTime.Year, LSysTime.Month, LSysTime.Day);
DecodeTime(ATime, LSysTime.Hour, LSysTime.Minute, LSysTime.Second, LSysTime.Millisecond);
if SystemTimeToFileTime(LSysTime, LFileTime) then
begin
if LocalFileTimeToFileTime(LFileTime, fileTime) then
begin
fileHandle:=FileOpen{UTF8}(aFilename, fmOpenReadWrite or fmShareExclusive);
{if} SetFileTime(fileHandle, fileTime, fileTime, fileTime) {then
Result:=True;}
end;
end;
finally
FileClose(fileHandle);
end;
end;
{$EndIf}
var
FileName1, FileName2: String;
F: TextFile;
begin
FileName1:=ParamStr(0);
WriteLn(FileName1);
writeln('Created:':10, DateTimeToStr(FileCreatedTime(FileName1)):20);
writeln('Modified:':10, DateTimeToStr(FileModifiedTime(FileName1)):20);
writeln;
FileName2 := 'test.txt';
if FileExists(FileName2) then
DeleteFile(FileName2);
AssignFile(F, FileName2);
Rewrite(F);
WriteLn(F, 'Some');
WriteLn(F, 'data');
CloseFile(F);
SetFileCreatedTime(FileName2, EncodeDateTime(2010, 8, 5, 10, 11, 12, 0));
SetFileModifiedTime(FileName2, EncodeDateTime(2023, 9, 4, 15, 44, 22, 0));
WriteLn(FileName2);
writeln('Created:':10, DateTimeToStr(FileCreatedTime(FileName2)):20);
writeln('Modified:':10, DateTimeToStr(FileModifiedTime(FileName2)):20);
readln;
end.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment