diff --git a/source/core/Script.cpp b/source/core/Script.cpp index f5cb25ca6..2623c8b26 100644 --- a/source/core/Script.cpp +++ b/source/core/Script.cpp @@ -1393,7 +1393,8 @@ void __fastcall TScript::DoMvOrCp(TScriptProcParams * Parameters, TFSCapability } else { - FTerminal->MoveFiles(FileList, TargetDirectory, FileMask); + bool DontOverwrite = true; // might use FConfirm eventually, but that would be breaking change + FTerminal->MoveFiles(FileList, TargetDirectory, FileMask, DontOverwrite); } } __finally diff --git a/source/core/Terminal.cpp b/source/core/Terminal.cpp index e0462f0ff..0d04b84bf 100644 --- a/source/core/Terminal.cpp +++ b/source/core/Terminal.cpp @@ -76,6 +76,7 @@ struct TMoveFileParams { UnicodeString Target; UnicodeString FileMask; + bool DontOverwrite; }; //--------------------------------------------------------------------------- struct TFilesFindParams @@ -4038,6 +4039,7 @@ bool __fastcall TTerminal::RecycleFile(const UnicodeString & AFileName, const TR TMoveFileParams Params; Params.Target = SessionData->RecycleBinPath; Params.FileMask = FORMAT(L"*-%s.*", (FormatDateTime(L"yyyymmdd-hhnnss", Now()))); + Params.DontOverwrite = false; Result = DoMoveFile(FileName, File, &Params); @@ -4627,15 +4629,15 @@ void __fastcall TTerminal::RenameFile(const TRemoteFile * File, const UnicodeStr { FileModified(File, File->FileName); LogEvent(FORMAT(L"Renaming file \"%s\" to \"%s\".", (File->FileName, NewName))); - if (DoRenameFile(File->FileName, File, NewName, false)) + if (DoRenameFile(File->FileName, File, NewName, false, false)) { ReactOnCommand(fsRenameFile); } } } //--------------------------------------------------------------------------- -bool __fastcall TTerminal::DoRenameFile(const UnicodeString FileName, const TRemoteFile * File, - const UnicodeString NewName, bool Move) +bool __fastcall TTerminal::DoRenameFile( + const UnicodeString & FileName, const TRemoteFile * File, const UnicodeString & NewName, bool Move, bool DontOverwrite) { // Can be foDelete when recycling (and overwrite should not happen in this case) bool IsBatchMove = (OperationProgress != NULL) && (OperationProgress->Operation == foRemoteMove); @@ -4647,6 +4649,7 @@ bool __fastcall TTerminal::DoRenameFile(const UnicodeString FileName, const TRem std::unique_ptr DuplicateFileOwner(DuplicateFile); if (BatchOverwrite == boNone) { + DebugAssert(!DontOverwrite); // unsupported combination Result = !FileExists(AbsoluteNewName); ExistenceKnown = true; } @@ -4655,7 +4658,8 @@ bool __fastcall TTerminal::DoRenameFile(const UnicodeString FileName, const TRem // noop } else if (DebugAlwaysTrue(BatchOverwrite == boNo) && - Configuration->ConfirmOverwriting) + Configuration->ConfirmOverwriting && + !DontOverwrite) { FileExists(AbsoluteNewName, &DuplicateFile); DuplicateFileOwner.reset(DuplicateFile); @@ -4722,7 +4726,7 @@ bool __fastcall TTerminal::DoRenameFile(const UnicodeString FileName, const TRem if (Result) { - if (!IsCapable[fcMoveOverExistingFile]) + if (!IsCapable[fcMoveOverExistingFile] && !DontOverwrite) { if (!ExistenceKnown) { @@ -4766,7 +4770,7 @@ bool __fastcall TTerminal::DoMoveFile(const UnicodeString & FileName, const TRem MaskFileName(UnixExtractFileName(FileName), Params.FileMask); LogEvent(FORMAT(L"Moving file \"%s\" to \"%s\".", (FileName, NewName))); FileModified(File, FileName); - bool Result = DoRenameFile(FileName, File, NewName, true); + bool Result = DoRenameFile(FileName, File, NewName, true, Params.DontOverwrite); if (Result) { ReactOnCommand(fsMoveFile); @@ -4779,12 +4783,13 @@ void __fastcall TTerminal::MoveFile(const UnicodeString FileName, const TRemoteF DoMoveFile(FileName, File, Param); } //--------------------------------------------------------------------------- -bool __fastcall TTerminal::MoveFiles(TStrings * FileList, const UnicodeString Target, - const UnicodeString FileMask) +bool __fastcall TTerminal::MoveFiles( + TStrings * FileList, const UnicodeString & Target, const UnicodeString & FileMask, bool DontOverwrite) { TMoveFileParams Params; Params.Target = Target; Params.FileMask = FileMask; + Params.DontOverwrite = DontOverwrite; bool Result; BeginTransaction(); try @@ -4877,6 +4882,7 @@ bool __fastcall TTerminal::CopyFiles(TStrings * FileList, const UnicodeString Ta TMoveFileParams Params; Params.Target = Target; Params.FileMask = FileMask; + Params.DontOverwrite = false; // not used DirectoryModified(Target, true); return ProcessFiles(FileList, foRemoteCopy, CopyFile, &Params); } diff --git a/source/core/Terminal.h b/source/core/Terminal.h index cb90b1435..18c505eef 100644 --- a/source/core/Terminal.h +++ b/source/core/Terminal.h @@ -276,8 +276,8 @@ friend class TRetryOperationLoop; int Params); void __fastcall DoCustomCommandOnFile(UnicodeString FileName, const TRemoteFile * File, UnicodeString Command, int Params, TCaptureOutputEvent OutputEvent); - bool __fastcall DoRenameFile(const UnicodeString FileName, const TRemoteFile * File, - const UnicodeString NewName, bool Move); + bool __fastcall DoRenameFile( + const UnicodeString & FileName, const TRemoteFile * File, const UnicodeString & NewName, bool Move, bool DontOverwrite); bool __fastcall DoMoveFile(const UnicodeString & FileName, const TRemoteFile * File, /*const TMoveFileParams*/ void * Param); void __fastcall DoCopyFile(const UnicodeString FileName, const TRemoteFile * File, const UnicodeString NewName); void __fastcall DoChangeFileProperties(const UnicodeString FileName, @@ -565,8 +565,8 @@ friend class TRetryOperationLoop; void __fastcall RenameFile(const TRemoteFile * File, const UnicodeString & NewName); void __fastcall MoveFile(const UnicodeString FileName, const TRemoteFile * File, /*const TMoveFileParams*/ void * Param); - bool __fastcall MoveFiles(TStrings * FileList, const UnicodeString Target, - const UnicodeString FileMask); + bool __fastcall MoveFiles( + TStrings * FileList, const UnicodeString & Target, const UnicodeString & FileMask, bool DontOverwrite); void __fastcall CopyFile(const UnicodeString FileName, const TRemoteFile * File, /*const TMoveFileParams*/ void * Param); bool __fastcall CopyFiles(TStrings * FileList, const UnicodeString Target, diff --git a/source/forms/CustomScpExplorer.cpp b/source/forms/CustomScpExplorer.cpp index ddbdcbd59..8b38ec5f7 100644 --- a/source/forms/CustomScpExplorer.cpp +++ b/source/forms/CustomScpExplorer.cpp @@ -4468,7 +4468,7 @@ bool __fastcall TCustomScpExplorerForm::RemoteTransferFiles( { Configuration->Usage->Inc("RemoteMove"); - Terminal->MoveFiles(FileList, Target, FileMask); + Terminal->MoveFiles(FileList, Target, FileMask, false); } else { @@ -6198,7 +6198,7 @@ void __fastcall TCustomScpExplorerForm::DoSynchronizeMove( RemoteDirView->SaveSelectedNames(); try { - Terminal->MoveFiles(FileList.get(), Target, FileMask); + Terminal->MoveFiles(FileList.get(), Target, FileMask, false); } catch(...) {