Ver código fonte

ADD: NtfsHourTimeDelay option to CompareDirectories

Alexander Koblov 11 anos atrás
pai
commit
889e37d3af
3 arquivos alterados com 31 adições e 1 exclusões
  1. 24 0
      src/platform/uOSUtils.pas
  2. 4 0
      src/uglobs.pas
  3. 3 1
      src/umaincommands.pas

+ 24 - 0
src/platform/uOSUtils.pas

@@ -67,6 +67,7 @@ type
     constructor Create; reintroduce;
     constructor Create; reintroduce;
   end;
   end;
 
 
+function NtfsHourTimeDelay(const SourceName, TargetName: UTF8String): Boolean;
 function FileIsLinkToFolder(const FileName: UTF8String; out LinkTarget: UTF8String): Boolean;
 function FileIsLinkToFolder(const FileName: UTF8String; out LinkTarget: UTF8String): Boolean;
 function ExecCmdFork(sCmdLine:String; bTerm : Boolean = False; sTerm : String = ''; bKeepTerminalOpen: Boolean = True):Boolean;
 function ExecCmdFork(sCmdLine:String; bTerm : Boolean = False; sTerm : String = ''; bKeepTerminalOpen: Boolean = True):Boolean;
 {en
 {en
@@ -458,6 +459,29 @@ begin
 end;
 end;
 {$ENDIF}
 {$ENDIF}
 
 
+function NtfsHourTimeDelay(const SourceName, TargetName: UTF8String): Boolean;
+{$IFDEF MSWINDOWS}
+var
+ lpDummy: DWORD = 0;
+ lpSourceFileSystem,
+ lpTargetFileSystem: array [0..MAX_PATH] of WideChar;
+begin
+ Result:= False;
+ if GetVolumeInformationW(PWideChar(UTF8Decode(ExtractFileDrive(SourceName)) + PathDelim),
+                          nil, 0, nil, lpDummy, lpDummy, lpSourceFileSystem, MAX_PATH) and
+    GetVolumeInformationW(PWideChar(UTF8Decode(ExtractFileDrive(TargetName)) + PathDelim),
+                          nil, 0, nil, lpDummy, lpDummy, lpTargetFileSystem, MAX_PATH) then
+  begin
+    Result:= (SameText(lpSourceFileSystem, 'FAT32') and SameText(lpTargetFileSystem, 'NTFS')) or
+             (SameText(lpTargetFileSystem, 'FAT32') and SameText(lpSourceFileSystem, 'NTFS'))
+  end;
+end;
+{$ELSE}
+begin
+  Result:= False;
+end;
+{$ENDIF}
+
 function CreateHardLink(const Path, LinkName: String) : Boolean;
 function CreateHardLink(const Path, LinkName: String) : Boolean;
 {$IFDEF MSWINDOWS}
 {$IFDEF MSWINDOWS}
 var
 var

+ 4 - 0
src/uglobs.pas

@@ -263,6 +263,7 @@ var
   gRenameSelOnlyName:boolean;
   gRenameSelOnlyName:boolean;
   gShowDialogOnDragDrop: Boolean;
   gShowDialogOnDragDrop: Boolean;
   gOverwriteFolder: Boolean;
   gOverwriteFolder: Boolean;
+  gNtfsHourTimeDelay: Boolean;
   gFileOperationsProgressKind: TFileOperationsProgressKind;
   gFileOperationsProgressKind: TFileOperationsProgressKind;
   gFileOperationsConfirmations: TFileOperationsConfirmations;
   gFileOperationsConfirmations: TFileOperationsConfirmations;
 
 
@@ -1099,6 +1100,7 @@ begin
   gSkipFileOpError := False;
   gSkipFileOpError := False;
   gShowDialogOnDragDrop := False;
   gShowDialogOnDragDrop := False;
   gOverwriteFolder := False;
   gOverwriteFolder := False;
+  gNtfsHourTimeDelay := False;
   gFileOperationsProgressKind := fopkSeparateWindow;
   gFileOperationsProgressKind := fopkSeparateWindow;
   gFileOperationsConfirmations := [focCopy, focMove, focDelete, focDeleteToTrash];
   gFileOperationsConfirmations := [focCopy, focMove, focDelete, focDeleteToTrash];
 
 
@@ -2109,6 +2111,7 @@ begin
       gSkipFileOpError := GetValue(Node, 'SkipFileOpError', gSkipFileOpError);
       gSkipFileOpError := GetValue(Node, 'SkipFileOpError', gSkipFileOpError);
       gShowDialogOnDragDrop := GetValue(Node, 'ShowDialogOnDragDrop', gShowDialogOnDragDrop);
       gShowDialogOnDragDrop := GetValue(Node, 'ShowDialogOnDragDrop', gShowDialogOnDragDrop);
       gOverwriteFolder := GetValue(Node, 'OverwriteFolder', gOverwriteFolder);
       gOverwriteFolder := GetValue(Node, 'OverwriteFolder', gOverwriteFolder);
+      gNtfsHourTimeDelay := GetValue(Node, 'NtfsHourTimeDelay', gNtfsHourTimeDelay);
       gFileOperationsProgressKind := TFileOperationsProgressKind(GetValue(Node, 'ProgressKind', Integer(gFileOperationsProgressKind)));
       gFileOperationsProgressKind := TFileOperationsProgressKind(GetValue(Node, 'ProgressKind', Integer(gFileOperationsProgressKind)));
       gFileOperationsConfirmations := TFileOperationsConfirmations(GetValue(Node, 'Confirmations', Integer(gFileOperationsConfirmations)));
       gFileOperationsConfirmations := TFileOperationsConfirmations(GetValue(Node, 'Confirmations', Integer(gFileOperationsConfirmations)));
       // Operations options
       // Operations options
@@ -2470,6 +2473,7 @@ begin
     SetValue(Node, 'SkipFileOpError', gSkipFileOpError);
     SetValue(Node, 'SkipFileOpError', gSkipFileOpError);
     SetValue(Node, 'ShowDialogOnDragDrop', gShowDialogOnDragDrop);
     SetValue(Node, 'ShowDialogOnDragDrop', gShowDialogOnDragDrop);
     SetValue(Node, 'OverwriteFolder', gOverwriteFolder);
     SetValue(Node, 'OverwriteFolder', gOverwriteFolder);
+    SetValue(Node, 'NtfsHourTimeDelay', gNtfsHourTimeDelay);
     SetValue(Node, 'ProgressKind', Integer(gFileOperationsProgressKind));
     SetValue(Node, 'ProgressKind', Integer(gFileOperationsProgressKind));
     SetValue(Node, 'Confirmations', Integer(gFileOperationsConfirmations));
     SetValue(Node, 'Confirmations', Integer(gFileOperationsConfirmations));
     // Operations options
     // Operations options

+ 3 - 1
src/umaincommands.pas

@@ -3008,6 +3008,7 @@ end;
 procedure TMainCommands.cm_CompareDirectories(const Params: array of string);
 procedure TMainCommands.cm_CompareDirectories(const Params: array of string);
 var
 var
   I: LongWord;
   I: LongWord;
+  NtfsShift: Boolean;
   SourceFile: TDisplayFile;
   SourceFile: TDisplayFile;
   TargetFile: TDisplayFile;
   TargetFile: TDisplayFile;
   SourceList: TStringHashList;
   SourceList: TStringHashList;
@@ -3017,6 +3018,7 @@ begin
   SourceList:= TStringHashList.Create(FileNameCaseSensitive);
   SourceList:= TStringHashList.Create(FileNameCaseSensitive);
   with frmMain do
   with frmMain do
   try
   try
+    NtfsShift:= gNtfsHourTimeDelay and NtfsHourTimeDelay(ActiveFrame.CurrentPath, NotActiveFrame.CurrentPath);
     SourceFiles:= ActiveFrame.DisplayFiles;
     SourceFiles:= ActiveFrame.DisplayFiles;
     TargetFiles:= NotActiveFrame.DisplayFiles;
     TargetFiles:= NotActiveFrame.DisplayFiles;
     for I:= 0 to SourceFiles.Count - 1 do
     for I:= 0 to SourceFiles.Count - 1 do
@@ -3036,7 +3038,7 @@ begin
       if (SourceFile = nil) then
       if (SourceFile = nil) then
         NotActiveFrame.MarkFile(TargetFile, True)
         NotActiveFrame.MarkFile(TargetFile, True)
       else
       else
-        case FileTimeCompare(SourceFile.FSFile.ModificationTime, TargetFile.FSFile.ModificationTime, False) of
+        case FileTimeCompare(SourceFile.FSFile.ModificationTime, TargetFile.FSFile.ModificationTime, NtfsShift) of
           0:
           0:
             ActiveFrame.MarkFile(SourceFile, False);
             ActiveFrame.MarkFile(SourceFile, False);
           +1:
           +1: