[英]Move a file to another Ftp directory and rename it
在过去的几个小时中,我一直在为此苦苦挣扎,而实际上,如果不重新下载和上传文件,我将无法找到一种方法。 可能吗?
这个问题有点类似: 我如何使用FTP在目录之间移动文件? 但是我感觉它没有解决,尽管得到了回答。
重命名文件本身很容易,并且没有任何问题,但是如何将其移动到另一个目录?
我有以下示例代码:
string uri2 = "ftp://ftpUser@testFtp.com/mainFolder/moveFrom/file.txt";
f = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri2));
f.Credentials = new NetworkCredential(ftpUser, ftpPass);
f.KeepAlive = false;
f.UsePassive = true;
f.Method = WebRequestMethods.Ftp.Rename;
f.Timeout = 5000;
f.UseBinary = true;
f.RenameTo = "ftp://ftpUser@testFtp.com/mainFolder/moveTo/file.txt";
FtpWebResponse response = (FtpWebResponse)f.GetResponse();
response.Close();
f.Abort();
我收到与另一个主题相同的错误:
The remote server returned an error: (550) File unavailable (eg, file not found, no access).
使用相对路径并没有什么不同。
我是不是做错了,还是从源文件夹下载,上传到dest然后从源中删除文件的唯一方法? 那是对FTP服务器的3个调用。
.NET在FTP协议上放置了一个抽象层,该抽象层可能会抽象太多,从而使某些事情变得不可能或棘手。 我没有.NET的源代码,但是基于Mono的FTPWebRequest的源代码(该实现试图与.NET兼容),它将对URI进行任何操作:
file_name
部分(请参见源代码中的CWDAndSetFileName
)。 将URL=ftp:/host/foo/bar/file1
重命名为RenameTo=file2
意味着在FTP命令中:
... log into host ...
CWD foo/bar
RNFR file1
RNTO file2
但是,如果您的源和目标位于不同的目录中,例如RenameTo=/foo/bar2/file2
,则希望这样:
... log into host ...
RNFR foo/bar/file1
RNTO foo/bar2/file2
不幸的是,这不是它的实现方式:(
如果幸运的话,您可以尝试使用相对路径,例如RenameTo=../bar2/file2
,这应该导致
... log into host ...
CWD foo/bar
RNFR file1
RNTO ../bar2/file2
这可能应该适用于Mono-Implementation,但是我不知道它是否也适用于真实的.NET。
编辑:我只是看看.NET 4.5的源代码 。 它与Mono的不同之处在于,它不会在文件操作之前对baseir进行CWD操作,而是在名称相对的情况下将当前baseir附加到该名称之前。 因此,使用renameTo=../bar2/file2
结果为
RNFR foo/bar/file1
RNTO foo/bar/../bar2/file2
而使用绝对名称renameTo=/bar2/file2
会导致
RNFR foo/bar/file1
RNTO /bar2/file2
根据FTP服务器的类型和设置,绝对名称可能会被解释为相对于用户主目录的根目录,或者它可能是真实的绝对路径。 因此,最好只使用相对路径,并且../dir/
的解决方案应该与Mono和“ real” .NET一起使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.