浏览代码

When overwriting existing remote directory while duplicating using secondary shell, removing the existing directory using the shell too

Improvement of Bug 2233 implementation

Source commit: 3f8be5abd7521ad105bd97bd653a7178ccbccf6e
Martin Prikryl 1 年之前
父节点
当前提交
fbf8bdb1b0
共有 2 个文件被更改,包括 24 次插入22 次删除
  1. 22 20
      source/core/Terminal.cpp
  2. 2 2
      source/core/Terminal.h

+ 22 - 20
source/core/Terminal.cpp

@@ -4287,12 +4287,12 @@ void __fastcall TTerminal::DeleteFile(UnicodeString FileName,
   }
   else
   {
-    DoDeleteFile(FileName, File, Params);
+    DoDeleteFile(FFileSystem, FileName, File, Params);
   }
 }
 //---------------------------------------------------------------------------
-void __fastcall TTerminal::DoDeleteFile(const UnicodeString FileName,
-  const TRemoteFile * File, int Params)
+void __fastcall TTerminal::DoDeleteFile(
+  TCustomFileSystem * FileSystem, const UnicodeString & FileName, const TRemoteFile * File, int Params)
 {
   LogEvent(FORMAT(L"Deleting file \"%s\".", (FileName)));
   FileModified(File, FileName, true);
@@ -4303,9 +4303,9 @@ void __fastcall TTerminal::DoDeleteFile(const UnicodeString FileName,
     TRmSessionAction Action(ActionLog, AbsolutePath(FileName, true));
     try
     {
-      DebugAssert(FFileSystem);
+      DebugAssert(FileSystem != NULL);
       // 'File' parameter: SFTPFileSystem needs to know if file is file or directory
-      FFileSystem->DeleteFile(FileName, File, Params, Action);
+      FileSystem->DeleteFile(FileName, File, Params, Action);
       if ((OperationProgress != NULL) && (OperationProgress->Operation == foDelete))
       {
         OperationProgress->Succeeded();
@@ -4922,6 +4922,20 @@ bool TTerminal::DoRenameOrCopyFile(
     BeginTransaction();
     try
     {
+      TCustomFileSystem * FileSystem;
+      if (!Rename &&
+          IsCapable[fcSecondaryShell] &&
+          File->IsDirectory &&
+          (FCommandSession != NULL)) // Won't be in scripting, there we let it fail later
+      {
+        PrepareCommandSession();
+        FileSystem = FCommandSession->FFileSystem;
+      }
+      else
+      {
+        FileSystem = GetFileSystemForCapability(fcRemoteCopy);
+      }
+
       if (!IsCapable[fcMoveOverExistingFile] && !DontOverwrite)
       {
         if (!ExistenceKnown)
@@ -4931,7 +4945,7 @@ bool TTerminal::DoRenameOrCopyFile(
 
         if (DuplicateFile.get() != NULL)
         {
-          DoDeleteFile(AbsoluteNewName, DuplicateFile.get(), 0);
+          DoDeleteFile(FileSystem, AbsoluteNewName, DuplicateFile.get(), 0);
         }
       }
 
@@ -4939,13 +4953,13 @@ bool TTerminal::DoRenameOrCopyFile(
       do
       {
         UnicodeString AbsoluteFileName = AbsolutePath(FileName, true);
-        DebugAssert(FFileSystem != NULL);
+        DebugAssert(FileSystem != NULL);
         if (Rename)
         {
           TMvSessionAction Action(ActionLog, AbsoluteFileName, AbsoluteNewName);
           try
           {
-            FFileSystem->RenameFile(FileName, File, NewName, !DontOverwrite);
+            FileSystem->RenameFile(FileName, File, NewName, !DontOverwrite);
           }
           catch (Exception & E)
           {
@@ -4958,18 +4972,6 @@ bool TTerminal::DoRenameOrCopyFile(
           TCpSessionAction Action(ActionLog, AbsoluteFileName, AbsoluteNewName);
           try
           {
-            bool CopyDirsOnSecondarySession = IsCapable[fcSecondaryShell];
-            TCustomFileSystem * FileSystem;
-            if (CopyDirsOnSecondarySession && File->IsDirectory &&
-                (FCommandSession != NULL)) // Won't be in scripting, there we let it fail later
-            {
-              PrepareCommandSession();
-              FileSystem = FCommandSession->FFileSystem;
-            }
-            else
-            {
-              FileSystem = GetFileSystemForCapability(fcRemoteCopy);
-            }
             FileSystem->CopyFile(FileName, File, NewName, !DontOverwrite);
           }
           catch (Exception & E)

+ 2 - 2
source/core/Terminal.h

@@ -275,8 +275,8 @@ protected:
   void __fastcall DoReadDirectoryProgress(int Progress, int ResolvedLinks, bool & Cancel);
   void __fastcall DoReadDirectory(bool ReloadOnly);
   void __fastcall DoCreateDirectory(const UnicodeString & DirName, bool Encrypt);
-  void __fastcall DoDeleteFile(const UnicodeString FileName, const TRemoteFile * File,
-    int Params);
+  void __fastcall DoDeleteFile(
+    TCustomFileSystem * FileSystem, const UnicodeString & FileName, const TRemoteFile * File, int Params);
   void __fastcall DoCustomCommandOnFile(UnicodeString FileName,
     const TRemoteFile * File, UnicodeString Command, int Params, TCaptureOutputEvent OutputEvent);
   bool DoRenameOrCopyFile(