Browse Source

Bug 1601: Allow creating multiple levels of directories, while synchronizing browsing to a non existing directory

https://winscp.net/tracker/1601

Source commit: 1aac9c708bd2dc2d159b42ae56ac70b7ea931b54
Martin Prikryl 7 years ago
parent
commit
c87d7d9d7e
2 changed files with 25 additions and 3 deletions
  1. 23 3
      source/forms/ScpCommander.cpp
  2. 2 0
      source/forms/ScpCommander.h

+ 23 - 3
source/forms/ScpCommander.cpp

@@ -1021,6 +1021,17 @@ UnicodeString __fastcall TScpCommanderForm::ChangeFilePath(UnicodeString Path, T
   return Result;
 }
 //---------------------------------------------------------------------------
+void __fastcall TScpCommanderForm::CreateRemoteDirectory(const UnicodeString & Path)
+{
+  UnicodeString Dir = UnixExtractFileDir(Path);
+  if (!IsUnixRootPath(Dir) && !Terminal->FileExists(Dir))
+  {
+    CreateRemoteDirectory(Dir);
+  }
+  TRemoteProperties Properties = GUIConfiguration->NewDirectoryProperties;
+  RemoteDirView->CreateDirectoryEx(Path, &Properties);
+}
+//---------------------------------------------------------------------------
 void __fastcall TScpCommanderForm::SynchronizeBrowsingLocal(
   UnicodeString PrevPath, UnicodeString & NewPath, bool Create)
 {
@@ -1057,8 +1068,7 @@ void __fastcall TScpCommanderForm::SynchronizeBrowsingLocal(
 
     if (Create)
     {
-      TRemoteProperties Properties = GUIConfiguration->NewDirectoryProperties;
-      RemoteDirView->CreateDirectoryEx(NewPath, &Properties);
+      CreateRemoteDirectory(UnixExcludeTrailingBackslash(NewPath));
     }
 
     RemoteDirView->Path = NewPath;
@@ -1070,6 +1080,16 @@ void __fastcall TScpCommanderForm::SynchronizeBrowsingLocal(
   }
 }
 //---------------------------------------------------------------------------
+void __fastcall TScpCommanderForm::CreateLocalDirectory(const UnicodeString & Path)
+{
+  UnicodeString Dir = ExtractFileDir(Path);
+  if (!Dir.IsEmpty() && !DirectoryExists(Dir))
+  {
+    CreateLocalDirectory(Dir);
+  }
+  LocalDirView->CreateDirectory(Path);
+}
+//---------------------------------------------------------------------------
 void __fastcall TScpCommanderForm::SynchronizeBrowsingRemote(
   UnicodeString PrevPath, UnicodeString & NewPath, bool Create)
 {
@@ -1116,7 +1136,7 @@ void __fastcall TScpCommanderForm::SynchronizeBrowsingRemote(
 
   if (Create)
   {
-    LocalDirView->CreateDirectory(NewPath);
+    CreateLocalDirectory(ExcludeTrailingBackslash(NewPath));
   }
 
   LocalDirView->Path = NewPath;

+ 2 - 0
source/forms/ScpCommander.h

@@ -562,6 +562,8 @@ protected:
     UnicodeString & NewPath, bool Create);
   void __fastcall SynchronizeBrowsingLocal(UnicodeString PrevPath, UnicodeString & NewPath, bool Create);
   void __fastcall SynchronizeBrowsingRemote(UnicodeString PrevPath, UnicodeString & NewPath, bool Create);
+  void __fastcall CreateLocalDirectory(const UnicodeString & Path);
+  void __fastcall CreateRemoteDirectory(const UnicodeString & Path);
   void __fastcall LocalPathComboUpdateDrives();
   void __fastcall LocalPathComboUpdate();
   virtual void __fastcall ToolbarItemResize(TTBXCustomDropDownItem * Item, int Width);