Răsfoiți Sursa

FIX: Bug #83 Linux, symlink, F6 makes copy symlink, do not move

Alexander Koblov 4 ani în urmă
părinte
comite
50e0bee59c
1 a modificat fișierele cu 32 adăugiri și 23 ștergeri
  1. 32 23
      src/filesources/filesystem/ufilesystemutil.pas

+ 32 - 23
src/filesources/filesystem/ufilesystemutil.pas

@@ -102,6 +102,7 @@ type
     procedure ShowError(sMessage: String);
     procedure ShowError(sMessage: String);
     procedure LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType);
     procedure LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType);
 
 
+    function DeleteFile(SourceFile: TFile): Boolean;
     function CheckFileHash(const FileName, Hash: String; Size: Int64): Boolean;
     function CheckFileHash(const FileName, Hash: String; Size: Int64): Boolean;
     function CompareFiles(const FileName1, FileName2: String; Size: Int64): Boolean;
     function CompareFiles(const FileName1, FileName2: String; Size: Int64): Boolean;
     function CopyFile(SourceFile: TFile; TargetFileName: String; Mode: TFileSystemOperationHelperCopyMode): Boolean;
     function CopyFile(SourceFile: TFile; TargetFileName: String; Mode: TFileSystemOperationHelperCopyMode): Boolean;
@@ -495,7 +496,7 @@ var
   Hash: String;
   Hash: String;
   Options: UInt32;
   Options: UInt32;
   Context: THashContext;
   Context: THashContext;
-  DeleteFile: Boolean = False;
+  bDeleteFile: Boolean = False;
 
 
   procedure OpenSourceFile;
   procedure OpenSourceFile;
   var
   var
@@ -749,7 +750,7 @@ begin
                       end
                       end
                     else
                     else
                       begin
                       begin
-                        DeleteFile := FSkipWriteError and not (Mode in [fsohcmAppend, fsohcmResume]);
+                        bDeleteFile := FSkipWriteError and not (Mode in [fsohcmAppend, fsohcmResume]);
                         if FSkipWriteError then Exit;
                         if FSkipWriteError then Exit;
                         case AskQuestion(rsMsgErrEWrite + ' ' + TargetFileName + ':',
                         case AskQuestion(rsMsgErrEWrite + ' ' + TargetFileName + ':',
                                          E.Message,
                                          E.Message,
@@ -763,7 +764,7 @@ begin
                             Exit;
                             Exit;
                           fsourSkipAll:
                           fsourSkipAll:
                             begin
                             begin
-                              DeleteFile := not (Mode in [fsohcmAppend, fsohcmResume]);
+                              bDeleteFile := not (Mode in [fsohcmAppend, fsohcmResume]);
                               FSkipWriteError := True;
                               FSkipWriteError := True;
                               Exit;
                               Exit;
                             end;
                             end;
@@ -776,7 +777,7 @@ begin
           except
           except
             on E: EReadError do
             on E: EReadError do
               begin
               begin
-                DeleteFile := FSkipReadError and not (Mode in [fsohcmAppend, fsohcmResume]);
+                bDeleteFile := FSkipReadError and not (Mode in [fsohcmAppend, fsohcmResume]);
                 if FSkipReadError then Exit;
                 if FSkipReadError then Exit;
                 case AskQuestion(rsMsgErrERead + ' ' + SourceFile.FullPath + ':',
                 case AskQuestion(rsMsgErrERead + ' ' + SourceFile.FullPath + ':',
                                  E.Message,
                                  E.Message,
@@ -790,7 +791,7 @@ begin
                     Exit;
                     Exit;
                   fsourSkipAll:
                   fsourSkipAll:
                     begin
                     begin
-                      DeleteFile := not (Mode in [fsohcmAppend, fsohcmResume]);
+                      bDeleteFile := not (Mode in [fsohcmAppend, fsohcmResume]);
                       FSkipReadError := True;
                       FSkipReadError := True;
                       Exit;
                       Exit;
                     end;
                     end;
@@ -823,7 +824,7 @@ begin
       on EFileSourceOperationAborting do
       on EFileSourceOperationAborting do
       begin
       begin
         // Always delete file when user aborted operation.
         // Always delete file when user aborted operation.
-        DeleteFile := True;
+        bDeleteFile := True;
         raise;
         raise;
       end;
       end;
     end;
     end;
@@ -838,7 +839,7 @@ begin
       begin
       begin
         // There was some error, because not all of the file has been copied.
         // There was some error, because not all of the file has been copied.
         // Ask if delete the not completed target file.
         // Ask if delete the not completed target file.
-        if DeleteFile or
+        if bDeleteFile or
            (AskQuestion('', rsMsgDeletePartiallyCopied,
            (AskQuestion('', rsMsgDeletePartiallyCopied,
                         [fsourYes, fsourNo], fsourYes, fsourNo) = fsourYes) then
                         [fsourYes, fsourNo], fsourYes, fsourNo) = fsourYes) then
         begin
         begin
@@ -938,7 +939,6 @@ function TFileSystemOperationHelper.MoveFile(SourceFile: TFile; TargetFileName:
 var
 var
   Message: String;
   Message: String;
   RetryRename: Boolean;
   RetryRename: Boolean;
-  RetryDelete: Boolean;
 begin
 begin
   if not (Mode in [fsohcmAppend, fsohcmResume]) then
   if not (Mode in [fsohcmAppend, fsohcmResume]) then
   begin
   begin
@@ -964,21 +964,7 @@ begin
   if FVerify then FStatistics.TotalBytes += SourceFile.Size;
   if FVerify then FStatistics.TotalBytes += SourceFile.Size;
   if CopyFile(SourceFile, TargetFileName, Mode) then
   if CopyFile(SourceFile, TargetFileName, Mode) then
   begin
   begin
-    repeat
-      RetryDelete := True;
-      if FileIsReadOnly(SourceFile.Attributes) then
-        FileSetReadOnlyUAC(SourceFile.FullPath, False);
-      Result := DeleteFileUAC(SourceFile.FullPath);
-      if (not Result) and (FDeleteFileOption = fsourInvalid) then
-      begin
-        Message := Format(rsMsgNotDelete, [WrapTextSimple(SourceFile.FullPath, 100)]) + LineEnding + LineEnding + mbSysErrorMessage;
-        case AskQuestion('', Message, [fsourSkip, fsourRetry, fsourAbort, fsourSkipAll], fsourSkip, fsourAbort) of
-          fsourAbort: AbortOperation;
-          fsourRetry: RetryDelete := False;
-          fsourSkipAll: FDeleteFileOption := fsourSkipAll;
-        end;
-      end;
-    until RetryDelete;
+    Result:= DeleteFile(SourceFile);
   end
   end
   else
   else
     Result := False;
     Result := False;
@@ -1232,6 +1218,7 @@ begin
             if CreateSymbolicLinkUAC(LinkTarget, AbsoluteTargetFileName) then
             if CreateSymbolicLinkUAC(LinkTarget, AbsoluteTargetFileName) then
             begin
             begin
               CopyProperties(aFile, AbsoluteTargetFileName);
               CopyProperties(aFile, AbsoluteTargetFileName);
+              if (FMode = fsohmMove) then Result:= DeleteFile(aFile);
             end
             end
             else
             else
             begin
             begin
@@ -1757,6 +1744,28 @@ begin
   end;
   end;
 end;
 end;
 
 
+function TFileSystemOperationHelper.DeleteFile(SourceFile: TFile): Boolean;
+var
+  Message: String;
+  RetryDelete: Boolean;
+begin
+  repeat
+    RetryDelete := True;
+    if FileIsReadOnly(SourceFile.Attributes) then
+      FileSetReadOnlyUAC(SourceFile.FullPath, False);
+    Result := DeleteFileUAC(SourceFile.FullPath);
+    if (not Result) and (FDeleteFileOption = fsourInvalid) then
+    begin
+      Message := Format(rsMsgNotDelete, [WrapTextSimple(SourceFile.FullPath, 100)]) + LineEnding + LineEnding + mbSysErrorMessage;
+      case AskQuestion('', Message, [fsourSkip, fsourRetry, fsourAbort, fsourSkipAll], fsourSkip, fsourAbort) of
+        fsourAbort: AbortOperation;
+        fsourRetry: RetryDelete := False;
+        fsourSkipAll: FDeleteFileOption := fsourSkipAll;
+      end;
+    end;
+  until RetryDelete;
+end;
+
 function TFileSystemOperationHelper.CheckFileHash(const FileName, Hash: String;
 function TFileSystemOperationHelper.CheckFileHash(const FileName, Hash: String;
   Size: Int64): Boolean;
   Size: Int64): Boolean;
 const
 const