Browse Source

* Hopefully fixed GetFileStamps/FileGetDateTimeInfo

Michaël Van Canneyt 2 years ago
parent
commit
c5af4c420e

+ 43 - 45
packages/vcl-compat/src/system.ioutils.pp

@@ -230,7 +230,7 @@ type
   private
     class function DetectFileEncoding(const aPath: String; out BOMLength: Integer
       ): TEncoding;
-    class procedure GetFileTimestamps(const aFilename: TFileName; var CreateUTC, WriteUTC, AccessUTC: TDateTime);
+    class procedure GetFileTimestamps(const aFilename: TFileName; var aCreate, aWrite, aAccess: TDateTime; IsUTC : Boolean);
   public
     class function IntegerToFileAttributes(const Attributes: Integer): TFileAttributes;
     class function FileAttributesToInteger(const Attributes: TFileAttributes): Integer;
@@ -1384,44 +1384,26 @@ end;
 
 { TFile }
 
-class procedure TFile.GetFileTimestamps(const aFilename: TFileName;
-  var CreateUTC, WriteUTC, AccessUTC: TDateTime);
-  {$IfDef MSWINDOWS}
-  var
-    Info:    TWin32FileAttributeData;
-    DosTime: DWORD;
-  {$endif}
-  {$ifdef UNIX}
-  var
-    Info: stat;
-  {$EndIf}
-begin
-  {$If Defined(MSWINDOWS)}
-    if not GetFileAttributesEx(PChar(aFileName), GetFileExInfoStandard, @info) then
-      RaiseLastOSError;
-    DosTime:=0;
-    FileTimeToDosDateTime(info.ftCreationTime, LongRec(DosTime).Hi, LongRec(DosTime).Lo);
-    CreateUTC:=FileDateToDateTime(DosTime);
-    FileTimeToDosDateTime(info.ftLastWriteTime, LongRec(DosTime).Hi, LongRec(DosTime).Lo);
-    WriteUTC :=FileDateToDateTime(DosTime);
-    FileTimeToDosDateTime(info.ftLastAccessTime, LongRec(DosTime).Hi, LongRec(DosTime).Lo);
-    AccessUTC:=FileDateToDateTime(DosTime);
-  {$ElseIf Defined(UNIX)}
-    Info:=Default(Stat);
-    if fpstat(aFileName, info) <> 0 then
-      raise EInOutError.CreateFmt(errStatFailed, [aFileName, fpgeterrno]);
-    CreateUTC:=UnixToDateTime(info.st_ctime, True);
-    WriteUTC :=UnixToDateTime(info.st_mtime, True);
-    AccessUTC:=UnixToDateTime(info.st_atime, True);
-  {$Else}
-    if FileAge(aFilename, CreateUTC) then
-    begin
-      WriteUTC := CreateUTC;
-      AccessUTC := CreateUTC;
-    end
-    else
-      raise EInOutError.CreateFmt(SErrFileNotFound, [aFileName]);
-  {$EndIf}
+class procedure TFile.GetFileTimestamps(const aFilename: TFileName; var aCreate, aWrite, aAccess: TDateTime; IsUTC: Boolean);
+
+var
+  DateTime: TDateTimeInfoRec;
+
+begin
+   if FileGetDateTimeInfo(aFileName,DateTime) then
+     begin
+     aCreate:=DateTime.CreationTime;
+     aWrite:=DateTime.TimeStamp;
+     aAccess:=DateTime.LastAccessTime;
+     if isUTC then
+       begin
+       aCreate:=LocalTimeToUniversal(aCreate);
+       aWrite:=LocalTimeToUniversal(aCreate);
+       aAccess:=LocalTimeToUniversal(aCreate);
+       end;
+     end
+   else
+     raise EInOutError.CreateFmt(SErrFileNotFound, [aFileName]);
 end;
 
 class function TFile.IntegerToFileAttributes(const Attributes: Integer
@@ -1703,8 +1685,14 @@ begin
 end;
 
 class function TFile.GetCreationTime(const aPath: string): TDateTime;
+
+var
+  Dummy1, Dummy2: TDateTime;
 begin
-  Result:=UTCtoLocal(TFile.GetCreationTimeUtc(aPath));
+  Result:=MinDateTime;
+  Dummy1:=MinDateTime;
+  Dummy2:=MinDateTime;
+  GetFileTimestamps(aPath, Result, Dummy1, Dummy2, False);
 end;
 
 class function TFile.GetCreationTimeUtc(const aPath: string): TDateTime;
@@ -1714,12 +1702,17 @@ begin
   Result:=MinDateTime;
   Dummy1:=MinDateTime;
   Dummy2:=MinDateTime;
-  GetFileTimestamps(aPath, Result, Dummy1, Dummy2);
+  GetFileTimestamps(aPath, Result, Dummy1, Dummy2, True);
 end;
 
 class function TFile.GetLastAccessTime(const aPath: string): TDateTime;
+var
+  Dummy1, Dummy2: TDateTime;
 begin
-  Result:=UTCtoLocal(TFile.GetLastAccessTimeUtc(aPath));
+  Result:=MinDateTime;
+  Dummy1:=MinDateTime;
+  Dummy2:=MinDateTime;
+  GetFileTimestamps(aPath, Dummy1, Dummy2, Result, False);
 end;
 
 class function TFile.GetLastAccessTimeUtc(const aPath: string): TDateTime;
@@ -1729,12 +1722,17 @@ begin
   Result:=MinDateTime;
   Dummy1:=MinDateTime;
   Dummy2:=MinDateTime;
-  GetFileTimestamps(aPath, Dummy1, Dummy2, Result);
+  GetFileTimestamps(aPath, Dummy1, Dummy2, Result,True);
 end;
 
 class function TFile.GetLastWriteTime(const aPath: string): TDateTime;
+var
+  Dummy1, Dummy2: TDateTime;
 begin
-  Result:=UTCtoLocal(TFile.GetLastWriteTime(aPath));
+  Result:=MinDateTime;
+  Dummy1:=MinDateTime;
+  Dummy2:=MinDateTime;
+  GetFileTimestamps(aPath, Dummy1, Result, Dummy2, False);
 end;
 
 class function TFile.GetLastWriteTimeUtc(const aPath: string): TDateTime;
@@ -1744,7 +1742,7 @@ begin
   Result:=MinDateTime;
   Dummy1:=MinDateTime;
   Dummy2:=MinDateTime;
-  GetFileTimestamps(aPath, Dummy1, Result, Dummy2);
+  GetFileTimestamps(aPath, Dummy1, Result, Dummy2,True);
 end;
 
 class function TFile.GetSymLinkTarget(const aFileName: string;

+ 11 - 25
rtl/objpas/sysutils/filutil.inc

@@ -696,11 +696,7 @@ begin
         Result:=FileDateToDateTime(data.st_ctime)
       {$endif}
     {$else}
-      {$IFDEF SEARCHREC_USEFINDDATA}
-        FileDateToDateTime(Data.Time);
-      {$ELSE}
-        Result:=0;
-      {$ENDIF}
+        Result:=FileDateToDateTime(Data.Time);
     {$ENDIF}
   {$ENDIF}
 end;
@@ -717,14 +713,9 @@ begin
         Result:=FileDateToDateTime(data.st_atime)
       {$endif}
     {$else}
-      {$IFDEF SEARCHREC_USEFINDDATA}
-        FileDateToDateTime(Data.Time);
-      {$ELSE}
-        Result:=0;
-      {$ENDIF}
+      Result:=FileDateToDateTime(Data.Time);
     {$ENDIF}
   {$ENDIF}
-
 end;
 
 function TDateTimeInfoRec.GetTimeStamp: TDateTime;
@@ -739,11 +730,7 @@ begin
         Result:=FileDateToDateTime(data.st_mtime)
       {$endif}
     {$else}
-      {$IFDEF SEARCHREC_USEFINDDATA}
-        FileDateToDateTime(Data.Time);
-      {$ELSE}
-        Result:=0;
-      {$ENDIF}
+       Result:=FileDateToDateTime(Data.Time);
     {$ENDIF}
   {$ENDIF}
 end;
@@ -991,18 +978,17 @@ end;
 {$IFNDEF HAS_FILEGETDATETIMEINFO}
 function FileGetDateTimeInfo(const FileName: string;
   out DateTime: TDateTimeInfoRec; FollowLink: Boolean = True): Boolean;
-{$IFDEF SEARCHREC_USEFINDDATA}
+
 var
   Info : TSearchRec;
-{$ENDIF}
+
 begin
-  {$IFDEF SEARCHREC_USEFINDDATA}
-    Result:=FindFirst(FileName,0,Info)=0;
-    if Result then
-      DateTime.data:=Info.FindData;
-  {$ELSE}
-    Result:=False;
-  {$ENDIF}
+  Result:=FindFirst(FileName,0,Info)=0;
+  if Result then
+     begin
+     DateTime.data:=Info;
+     FindClose(FileName,0,Info)
+     end;
 end;
 {$ENDIF}
 

+ 3 - 5
rtl/objpas/sysutils/filutilh.inc

@@ -148,22 +148,19 @@ Type
 
   TDateTimeInfoRec = record
   private
-{$IFDEF SEARCHREC_USEFINDDATA}
+{$IF DEFINED(WINDOWS) AND NOT DEFINED(WIN16)}
     Data: TFindData platform;
-
 {$ELSE}
   {$IFDEF UNIX}
-
     {$IFDEF USE_STATX}
     data : tstatx platform;
     {$ELSE}
     data : baseunix.stat platform;
     {$ENDIF USE_STATX}
   {$ELSE}
-  
     data : TSearchRec;
   {$ENDIF}
-{$ENDIF SEARCHREC_USEFINDDATA}
+{$ENDIF}
 
     function GetCreationTime: TDateTime;
     function GetLastAccessTime: TDateTime;
@@ -239,6 +236,7 @@ Function ExeSearch  (Const Name : UnicodeString; Const DirList : UnicodeString =
 Function FileIsReadOnly(const FileName : UnicodeString): Boolean;
 function FileAge(const FileName: UnicodeString; out FileDateTime: TDateTime; FollowLink: Boolean = True): Boolean;
 function FileAgeUTC(const FileName: UnicodeString; out FileDateTimeUTC: TDateTime; FollowLink: Boolean = True): Boolean;
+function FileGetDateTimeInfo(const FileName: string; out DateTime: TDateTimeInfoRec; FollowLink: Boolean = True): Boolean;
 function FileGetSymLinkTarget(const FileName: UnicodeString; out SymLinkRec: TUnicodeSymLinkRec): Boolean;
 function FileGetSymLinkTarget(const FileName: UnicodeString; out TargetName: UnicodeString): Boolean; inline;