Przeglądaj źródła

* FileGetDate, FileSetDate with TDateTime and UTC

git-svn-id: trunk@47396 -
(cherry picked from commit d899c9fca47b5b547719ab484f55fbe59285df33)
ondrej 4 lat temu
rodzic
commit
f40e227250

+ 15 - 1
rtl/objpas/sysutils/dati.inc

@@ -1283,6 +1283,20 @@ begin
 {$endif unix}
 end;
 
+Function UniversalToFileDate(DateTime : TDateTime) : int64;
+{$ifndef unix}
+begin
+  Result := DateTimeToFileDate(UniversalTimeToLocal(DateTime));
+end;
+{$else unix}
+Var YY,MM,DD,H,m,s,msec : Word;
+begin
+  Decodedate (DateTime,YY,MM,DD);
+  DecodeTime (DateTime,h,m,s,msec);
+  Result:=UniversalToEpoch(yy,mm,dd,h,m,s);
+end;
+{$endif unix}
+
 function CurrentYear: Word;
 var
   SysTime: TSystemTime;
@@ -1311,7 +1325,7 @@ begin
 end;
 {$endif unix}
 
-Function FileDateToUTC (Filedate : Int64) : TDateTime;
+Function FileDateToUniversal (Filedate : Int64) : TDateTime;
 
 {$ifndef unix}
 begin

+ 2 - 2
rtl/objpas/sysutils/datih.inc

@@ -160,7 +160,9 @@ function FormatDateTime(const FormatStr: string; DateTime: TDateTime; const Form
 procedure DateTimeToString(out Result: string; const FormatStr: string; const DateTime: TDateTime; Options : TFormatDateTimeOptions = []);
 procedure DateTimeToString(out Result: string; const FormatStr: string; const DateTime: TDateTime; const FormatSettings: TFormatSettings; Options : TFormatDateTimeOptions = []);
 Function DateTimeToFileDate(DateTime : TDateTime) : int64;
+Function UniversalToFileDate(DateTime : TDateTime) : int64;
 Function FileDateToDateTime (Filedate : Int64) :TDateTime;
+Function FileDateToUniversal (Filedate : Int64) :TDateTime;
 function TryStrToDate(const S: ShortString; out Value: TDateTime): Boolean;                         {$ifdef SYSUTILSINLINE}inline;{$endif}
 function TryStrToDate(const S: AnsiString; out Value: TDateTime): Boolean;                         {$ifdef SYSUTILSINLINE}inline;{$endif}
 function TryStrToDate(const S: ShortString; out Value: TDateTime; separator : char): Boolean;
@@ -205,8 +207,6 @@ function GetLocalTimeOffset: Integer;
 function GetLocalTimeOffset(const DateTime: TDateTime; const InputIsUTC: Boolean; out Offset: Integer): Boolean;
 function GetLocalTimeOffset(const DateTime: TDateTime; const InputIsUTC: Boolean = False): Integer;
 
-Function FileDateToUTC (Filedate : Int64) : TDateTime;
-
 { UTC <-> Local time }
 Function UniversalTimeToLocal(UT: TDateTime): TDateTime;
 Function UniversalTimeToLocal(UT: TDateTime; TZOffset : Integer): TDateTime;

+ 37 - 3
rtl/objpas/sysutils/filutil.inc

@@ -133,7 +133,7 @@ begin
   Result:=FindFirst(FileName,A,Info)=0;
   if Result then
     begin
-      FileDateTimeUTC:=FileDateToUTC(Info.Time);
+      FileDateTimeUTC:=FileDateToUniversal(Info.Time);
       FindClose(Info);
     end;
 end;
@@ -706,7 +706,7 @@ begin
 {$if declared(FindDataTimeToUTC)}
   if not FindDataTimeToUTC(FindData.ftLastWriteTime, Result) then
 {$endif}
-    Result := FileDateToUTC(Time);
+    Result := FileDateToUniversal(Time);
 end;
 
 { TRawbyteSearchRec }
@@ -734,7 +734,7 @@ begin
 {$if declared(FindDataTimeToDateTime)}
   if not FindDataTimeToUTC(FindData.ftLastWriteTime, Result) then
 {$endif}
-    Result := FileDateToUTC(Time);
+    Result := FileDateToUniversal(Time);
 end;
 
 { TUnicodeSymLinkRec }
@@ -838,3 +838,37 @@ Function GetFileAsString(Const aFileName : UnicodeString; aEncoding : TEncoding)
 begin
   Result:=aEncoding.GetString(GetFileContents(aFileName))
 end;
+
+{$IFNDEF HAS_FILEDATETIME}
+Function FileGetDate (Handle : THandle; out FileDateTime: TDateTime) : Boolean;
+Var
+  aDate : Int64;
+begin
+  aDate:=FileGetDate(Handle);
+  Result:=aDate>=0;
+  if Result then
+    FileDateTime:=FileDateToDateTime(aDate);
+end;
+
+Function FileGetDateUTC (Handle : THandle; out FileDateTimeUTC: TDateTime) : Boolean;
+Var
+  aDate : Int64;
+begin
+  aDate:=FileGetDate(Handle);
+  Result:=aDate>=0;
+  if Result then
+    FileDateTimeUTC:=FileDateToUniversal(aDate);
+end;
+
+Function FileSetDate (Handle : THandle; const Age: TDateTime) : Boolean;
+begin
+  Result := FileSetDate(DateTimeToFileDate(Age));
+end;
+
+Function FileSetDateUTC (Handle : THandle; const AgeUTC: TDateTime) : Boolean;
+begin
+  Result := FileSetDate(DateTimeToFileDate(AgeUTC));
+end;
+
+
+{$ENDIF}

+ 4 - 0
rtl/objpas/sysutils/filutilh.inc

@@ -241,7 +241,11 @@ Function FileTruncate (Handle : THandle;Size: Int64) : boolean;
 Function FindNext (Var Rslt : TRawByteSearchRec) : Longint;
 Procedure FindClose (Var F : TRawByteSearchrec);
 Function FileGetDate (Handle : THandle) : Int64;
+Function FileGetDate (Handle : THandle; out FileDateTime: TDateTime) : Boolean;
+Function FileGetDateUTC (Handle : THandle; out FileDateTimeUTC: TDateTime) : Boolean;
 Function FileSetDate (Handle : THandle;Age : Int64) : Longint;
+Function FileSetDate (Handle : THandle; const Age: TDateTime) : Boolean;
+Function FileSetDateUTC (Handle : THandle; const AgeUTC: TDateTime) : Boolean;
 Function GetFileHandle(var f : File):THandle;
 Function GetFileHandle(var f : Text):THandle;
 

+ 43 - 0
rtl/win/sysutils.pp

@@ -35,6 +35,7 @@ uses
 {$DEFINE HAS_LOCALTIMEZONEOFFSET}
 {$DEFINE HAS_GETTICKCOUNT}
 {$DEFINE HAS_GETTICKCOUNT64}
+{$DEFINE HAS_FILEDATETIME}
 {$DEFINE OS_FILESETDATEBYNAME}
 
 // this target has an fileflush implementation, don't include dummy
@@ -664,6 +665,24 @@ begin
   Result:=-1;
 end;
 
+Function FileGetDate (Handle : THandle; out FileDateTime: TDateTime) : Boolean;
+Var
+  FT : TFileTime;
+begin
+  Result :=
+     GetFileTime(Handle,nil,nil,@ft) and
+     FindDataTimeToDateTime(FT, FileDateTime);
+end;
+
+Function FileGetDateUTC (Handle : THandle; out FileDateTimeUTC: TDateTime) : Boolean;
+Var
+  FT : TFileTime;
+begin
+  Result :=
+     GetFileTime(Handle,nil,nil,@ft) and
+     FindDataTimeToUTC(FT, FileDateTimeUTC);
+end;
+
 Function FileSetDate (Handle : THandle;Age : Int64) : Longint;
 Var
   FT: TFileTime;
@@ -675,6 +694,30 @@ begin
   Result := GetLastError;
 end;
 
+Function FileSetDate (Handle : THandle; const Age: TDateTime) : Boolean;
+var
+  FT: TFiletime;
+  LT: TFiletime;
+  ST: TSystemTime;
+begin
+  DateTimeToSystemTime(Age,ST);
+  Result :=
+        SystemTimeToFileTime(ST,LT)
+    and LocalFileTimeToFileTime(LT,FT)
+    and SetFileTime(Handle,nil,nil,@FT);
+end;
+
+Function FileSetDateUTC (Handle : THandle; const AgeUTC: TDateTime) : Boolean;
+var
+  FT: TFiletime;
+  ST: TSystemTime;
+begin
+  DateTimeToSystemTime(AgeUTC,ST);
+  Result :=
+    SystemTimeToFileTime(ST,FT) and
+    SetFileTime(Handle,nil,nil,@FT);
+end;
+
 {$IFDEF OS_FILESETDATEBYNAME}
 Function FileSetDate (Const FileName : UnicodeString;Age : Int64) : Longint;
 Var