diff --git a/src/core/FtpFileSystem.cpp b/src/core/FtpFileSystem.cpp index 062aae90f..0c5353e34 100644 --- a/src/core/FtpFileSystem.cpp +++ b/src/core/FtpFileSystem.cpp @@ -1702,7 +1702,7 @@ void TFTPFileSystem::CopyToLocal(const TStrings *AFilesToCopy, try { SinkRobust(AbsoluteFilePath, File, TargetDirectory, CopyParam, Params, - OperationProgress, tfFirstLevel); + OperationProgress, FLAGSET(Params, cpFirstLevel) ? tfFirstLevel : 0); Success = true; FLastDataSent = Now(); } @@ -2011,7 +2011,7 @@ void TFTPFileSystem::CopyToRemote(const TStrings *AFilesToCopy, } } SourceRobust(FileName, File, FullTargetDir, CopyParam, Params, OperationProgress, - tfFirstLevel); + FLAGSET(Params, cpFirstLevel)? tfFirstLevel : 0); Success = true; FLastDataSent = Now(); } diff --git a/src/core/SftpFileSystem.cpp b/src/core/SftpFileSystem.cpp index b6d2c6784..553971199 100644 --- a/src/core/SftpFileSystem.cpp +++ b/src/core/SftpFileSystem.cpp @@ -4554,7 +4554,7 @@ void TSFTPFileSystem::CopyToRemote(const TStrings *AFilesToCopy, } } SFTPSourceRobust(FileName, File, FullTargetDir, CopyParam, Params, OperationProgress, - tfFirstLevel); + FLAGSET(Params, cpFirstLevel) ? tfFirstLevel : 0); Success = true; } catch (ESkipFile &E) @@ -5806,7 +5806,7 @@ void TSFTPFileSystem::CopyToLocal(const TStrings *AFilesToCopy, try { SFTPSinkRobust(LocalCanonify(FileName), File, TargetDirectory, CopyParam, - Params, OperationProgress, tfFirstLevel); + Params, OperationProgress, FLAGSET(Params, cpFirstLevel) ? tfFirstLevel : 0); Success = true; } catch (ESkipFile &E) diff --git a/src/core/Terminal.cpp b/src/core/Terminal.cpp index 0df128861..361e512a0 100644 --- a/src/core/Terminal.cpp +++ b/src/core/Terminal.cpp @@ -999,11 +999,13 @@ bool TParallelOperation::CheckEnd(TCollectedFileList *Files) return Result; } -intptr_t TParallelOperation::GetNext(TTerminal *Terminal, UnicodeString &FileName, TObject *&Object, UnicodeString &TargetDir, bool &Dir, bool &Recursed) +intptr_t TParallelOperation::GetNext(TTerminal *Terminal, UnicodeString &FileName, TObject *&Object, UnicodeString &TargetDir, bool &Dir, bool &Recursed, + bool &FirstLevel) { TGuard Guard(*FSection.get()); intptr_t Result = 1; TCollectedFileList *Files; + FirstLevel = false; do { if (FFileList->GetCount() > 0) @@ -1032,7 +1034,6 @@ intptr_t TParallelOperation::GetNext(TTerminal *Terminal, UnicodeString &FileNam Dir = Files->IsDir(FIndex); Recursed = Files->IsRecursed(FIndex); UnicodeString DirPath; - bool FirstLevel; if (FSide == osLocal) { DirPath = ::ExtractFileDir(FileName); @@ -1050,10 +1051,13 @@ intptr_t TParallelOperation::GetNext(TTerminal *Terminal, UnicodeString &FileNam } else { + UnicodeString DirPath_nobs = Sysutils::ExcludeTrailingBackslash(DirPath); TDirectories::const_iterator DirectoryIterator = FDirectories.find(DirPath); - if (DebugAlwaysFalse(DirectoryIterator == FDirectories.end())) + if (DirectoryIterator == FDirectories.end()) { - throw EInvalidOperation(L"Parent path not known"); + DirectoryIterator = FDirectories.find(DirPath_nobs); + if (DirectoryIterator == FDirectories.end()) + throw EInvalidOperation(L"Parent path not known"); } const TDirectoryData &DirectoryData = DirectoryIterator->second; if (!DirectoryData.Exists) @@ -6942,8 +6946,9 @@ intptr_t TTerminal::CopyToParallel(TParallelOperation *ParallelOperation, TFileO UnicodeString TargetDir; bool Dir; bool Recursed; + bool FirstLevel; - intptr_t Result = ParallelOperation->GetNext(this, FileName, Object, TargetDir, Dir, Recursed); + intptr_t Result = ParallelOperation->GetNext(this, FileName, Object, TargetDir, Dir, Recursed, FirstLevel); if (Result > 0) { std::unique_ptr FilesToCopy(new TStringList()); @@ -6963,6 +6968,11 @@ intptr_t TTerminal::CopyToParallel(TParallelOperation *ParallelOperation, TFileO Params = Params | cpNoRecurse; } + if (FirstLevel) + { + Params = Params | cpFirstLevel; + } + intptr_t Prev = OperationProgress->GetFilesFinishedSuccessfully(); try__finally { diff --git a/src/core/Terminal.h b/src/core/Terminal.h index f6cd5507e..189654851 100644 --- a/src/core/Terminal.h +++ b/src/core/Terminal.h @@ -219,6 +219,7 @@ const int cpNewerOnly = 0x10; const int cpAppend = 0x20; const int cpResume = 0x40; const int cpNoRecurse = 0x80; +const int cpFirstLevel = 0x100; const int ccApplyToDirectories = 0x01; const int ccRecursive = 0x02; @@ -1149,7 +1150,7 @@ public: void RemoveClient(); intptr_t GetNext( TTerminal *Terminal, UnicodeString &FileName, TObject *&Object, UnicodeString &TargetDir, - bool &Dir, bool &Recursed); + bool &Dir, bool &Recursed, bool &FirstLevel); void Done(UnicodeString FileName, bool Dir, bool Success); #if 0 diff --git a/src/core/WebDAVFileSystem.cpp b/src/core/WebDAVFileSystem.cpp index 035b34faf..286896f83 100644 --- a/src/core/WebDAVFileSystem.cpp +++ b/src/core/WebDAVFileSystem.cpp @@ -1436,7 +1436,7 @@ void TWebDAVFileSystem::CopyToRemote(const TStrings *AFilesToCopy, } } SourceRobust(FileName, File, FullTargetDir, CopyParam, Params, OperationProgress, - tfFirstLevel); + FLAGSET(Params, cpFirstLevel) ? tfFirstLevel : 0); Success = true; } catch (ESkipFile &E) @@ -1865,7 +1865,7 @@ void TWebDAVFileSystem::CopyToLocal(const TStrings *AFilesToCopy, try { SinkRobust(AbsoluteFilePath, File, TargetDirectory, CopyParam, Params, - OperationProgress, tfFirstLevel); + OperationProgress, FLAGSET(Params, cpFirstLevel) ? tfFirstLevel : 0); Success = true; } catch (ESkipFile &E)