1
0
mirror of https://github.com/winscp/winscp.git synced 2026-10-24 02:28:55 +03:00

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
This commit is contained in:
Martin Prikryl
2023-11-06 13:12:32 +00:00
parent 86c89666a7
commit fbf8bdb1b0
2 changed files with 24 additions and 22 deletions

View File

@@ -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)

View File

@@ -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(