繁体   English   中英

将文件移到另一个Ftp目录并重命名

[英]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进行任何操作:

  • 首先将URI拆分为目录部分和file_name部分(请参见源代码中的CWDAndSetFileName )。
  • CWD到目录。
  • 并在那里进行操作。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM