Преглед изворни кода

* fix for Mantis #35906: use more accurate modified time from the FindData on Windows for the Timestamp

git-svn-id: trunk@42559 -
svenbarth пре 6 година
родитељ
комит
3d585db43d
1 измењених фајлова са 29 додато и 14 уклоњено
  1. 29 14
      rtl/objpas/sysutils/filutil.inc

+ 29 - 14
rtl/objpas/sysutils/filutil.inc

@@ -592,31 +592,51 @@ begin
   InternalFindClose(f.FindHandle{$ifdef SEARCHREC_USEFINDDATA},f.FindData{$endif});
 end;
 
+{$if defined(windows) and not defined(win16)}
+function FindDataTimeToDateTime(constref aFileTime: FILETIME; out aResult: TDateTime): Boolean;
+var
+  st, lt: TSystemTime;
+begin
+  Result := FileTimeToSystemTime(aFileTime, st);
+  if Result then begin
+{$ifndef wince}
+    if SystemTimeToTzSpecificLocalTime(Nil, st, lt) then
+      aResult := SystemTimeToDateTime(lt)
+    else
+{$endif}
+      aResult := SystemTimeToDateTime(st);
+  end;
+end;
+{$endif}
+
 { TUnicodeSearchRec }
 
 function TUnicodeSearchRec.GetTimeStamp: TDateTime;
 begin
+{$if declared(FindDataTimeToDateTime)}
+  if not FindDataTimeToDateTime(FindData.ftLastWriteTime, Result) then
+{$else}
   Result := FileDateToDateTime(Time);
+{$endif}
 end;
 
 { TRawbyteSearchRec }
 
 function TRawbyteSearchRec.GetTimeStamp: TDateTime;
 begin
+{$if declared(FindDataTimeToDateTime)}
+  if not FindDataTimeToDateTime(FindData.ftLastWriteTime, Result) then
+{$else}
   Result := FileDateToDateTime(Time);
+{$endif}
 end;
 
 { TUnicodeSymLinkRec }
 
 function TUnicodeSymLinkRec.GetTimeStamp: TDateTime;
-{$if defined(win32) or defined(win64) or defined(wince)}
-var
-  st: TSystemTime;
-{$endif}
 begin
-{$if defined(win32) or defined(win64) or defined(wince)}
-  FileTimeToSystemTime(FindData.ftLastWriteTime, st);
-  Result := SystemTimeToDateTime(st);
+{$if declared(FindDataTimeToDateTime)}
+  if not FindDataTimeToDateTime(FindData.ftLastWriteTime, Result) then
 {$else}
   Result := 0;
 {$endif}
@@ -625,14 +645,9 @@ end;
 { TRawbyteSymLinkRec }
 
 function TRawbyteSymLinkRec.GetTimeStamp: TDateTime;
-{$if defined(win32) or defined(win64) or defined(wince)}
-var
-  st: TSystemTime;
-{$endif}
 begin
-{$if defined(win32) or defined(win64) or defined(wince)}
-  FileTimeToSystemTime(FindData.ftLastWriteTime, st);
-  Result := SystemTimeToDateTime(st);
+{$if declared(FindDataTimeToDateTime)}
+  if not FindDataTimeToDateTime(FindData.ftLastWriteTime, Result) then
 {$else}
   Result := 0;
 {$endif}