【问题标题】:Move a file to another Ftp directory and rename it将文件移动到另一个 Ftp 目录并重命名它
【发布时间】:2014-12-19 05:30:25
【问题描述】:

在过去的几个小时里,我一直在为此苦苦挣扎,如果不重新下载和上传文件,我真的找不到解决办法。有没有可能?

这个问题有点像这个问题的副本: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).

使用相对路径,没有什么不同。

我做错了什么还是从源文件夹下载,上传到目标然后从源中删除文件的唯一方法? 这是对 FTP 服务器的 3 次调用..

【问题讨论】:

  • 并且您确定文件路径是正确的,即。文件真的存在吗?
  • 是的,文件在那里,我可以在浏览器中打开它。
  • 您尝试使用什么相对路径?你试过/mainfolder/moveFrom/file.txt和/mainfolder/moveTo/file.txt

标签: c# .net ftp rename file-move


【解决方案1】:

.NET 在 FTP 协议上放置了一个抽象层,它可以抽象太多,从而使某些事情变得不可能或棘手。我没有 .NET 的源代码,但基于 source of FTPWebRequest from Mono(一种尝试与 .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。

编辑: 我刚刚看了source for .NET 4.5。它与 Mono 的不同之处在于它不会在文件操作之前对 basedir 执行 CWD,而是在名称是相对名称的情况下将当前的 basedir 预先添加到名称中。因此,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 和“真正的”.NET。

【讨论】:

  • 我刚刚在 .NET 4.0 上测试了来自 @steffen 的相对路径建议,它确实有效。它导致与 FTP 服务器的以下通信(使用 Wireshark 嗅探):[RNFR pub/test1/testfile.txt] [350 文件存在,准备好目标名称] [RNTO pub/test1/../test2/testfile3.txt ] [250 RNTO 命令成功。] 所以文件被移动并重命名。
  • @Steffen 感谢您的详细回答!我会调查并回复你。有示例代码吗?
  • @Apostrofix:不,我自己不会写C#,我只会看,而且我知道FTP协议。但在您的示例中,它可能应该只是 f.RenameTo="../moveTo/file.txt"。
猜你喜欢
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-14
  • 2016-10-14
  • 1970-01-01
  • 2012-02-26
  • 1970-01-01
相关资源
最近更新 更多