过去几个小时我一直在努力解决这个问题,而且我无法在不下载和再次上传文件的情况下找到办法。它甚至可能吗?
这个问题就是这个问题的副本:How can I use FTP to move files between directories?但我觉得它没有解决,尽管它得到了解答。
重命名文件本身非常简单,没有任何问题,但如何将其移动到另一个目录?
我有这个示例代码:
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 (e.g., file not found, no access).
使用相对路径,不做任何不同的事情。
我做错了什么或者是从源文件夹下载,上传到dest然后从源文件中删除文件的唯一方法? 这是对FTP服务器的调用..
答案 0 :(得分:2)
.NET在FTP协议上设置了一个抽象层,它可以抽象太多,从而使一些事情变得不可能或棘手。我没有.NET的源代码,但基于source of FTPWebRequest from Mono(尝试与.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。
编辑:
我刚看了source for .NET 4.5。它与Mono的不同之处在于它不会在文件操作之前对basedir执行CWD,而是在名称是相对的情况下将当前基于它的名称添加到名称。因此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。