[问题] Session::RemoveFiles()
是否删除源目录子目录中的文件?如果没有,如何实现这种能力?
(请不要问我为什么我将远程目录设为/C/testTransfer/
。该代码仅用于测试目的。)
我有一个使用WinSCP .Net程序集的SFTP程序。程序语言是C ++ / CLI。它打开了一个工作文件。该文件包含许多FTP指令行。
我必须处理的一种指令是从源目录传输*.txt
。源目录可能包含可能包含.txt
的子目录。传输成功后,删除源文件。
我使用Session::GetFiles()
进行转移。它正确地将所有.txt
个文件(/C/testTransfer/*.txt
),即使是源目录中的子目录(/C/testTransfer/sub/*.txt
)中的文件传输到目的地。
transferOptions->FileMask = "*.txt";
session->GetFiles("/C/testTransfer", "C:\\temp\\win", false, transferOption);
现在要删除,我使用session->RemoveFiles("/C/testTransfer/*.txt")
。我只会在源(*.txt
)中看到/C/testTransfer/*.txt
,但在子目录(/C/testTransfer/sub/*.txt
)中看不到。
答案 0 :(得分:2)
Session::RemoveFiles
一般可以删除子目录中的文件。但不是这种方式使用通配符,因为WinSCP不会下降到与通配符(*.txt
)不匹配的子目录。另请注意,即使您不需要通配符,Session::RemoveFiles
也会删除子目录本身,我不确定您想要它。
虽然您有其他(更好的=更安全)选项:
使用remove
parameter的Session::GetFiles
method指示其在成功转移后删除源文件。
如果您需要以事务方式删除源文件(=仅在下载所有文件成功后),请迭代Session::GetFiles
返回的TransferOperationResult::Transfers
并为每个文件调用Session::RemoveFiles
(除非TransferEventArgs::Error
不为空。)
使用TransferEventArgs::FileName
获取要传递给Session::RemoveFiles
的文件路径。使用RemotePath::EscapeFileMask
转义文件名,然后再将其传递给Session::RemoveFiles
。
Moving local files to different location after successful upload有一个类似的完整示例。
要在独立操作中递归删除与通配符匹配的文件(不是在下载相同文件后),请使用Session::EnumerateRemoteFiles
。将通配符传递给其mask
参数。使用EnumerationOptions.AllDirectories
选项进行递归。
为每个返回的文件调用Session::RemoveFiles
。在将文件名传递给Session::RemoveFiles
之前,请使用RemotePath::EscapeFileMask
转义文件名。