当前位置: 首页 > 知识库问答 >
问题:

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

赵智
2023-03-14

在过去的几个小时里,我一直在努力解决这个问题,如果不再次下载和上传文件,我真的找不到一个方法来解决这个问题。有可能吗?

这个问题类似于这个问题:我如何使用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();

我得到了与另一个主题相同的错误:

远程服务器返回错误:(550)文件不可用(例如,找不到文件,无法访问)。

使用相对路径,不会有任何不同。

我是否做错了什么,或者是从源文件夹下载、上载到dest然后从源文件夹删除文件的唯一方法?这是对FTP服务器的3次调用。。


共有1个答案

鞠宏恺
2023-03-14

. 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

但是,如果源和目标位于不同的目录中,例如,重命名to=/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实现,但我不知道它是否也适用于real.NET。

编辑:我刚刚看了一下源代码。NET 4.5。它与Mono的不同之处在于它不会在文件操作之前对base dir执行CWD,而是在名称相对的情况下将当前base dir添加到名称之前。因此,使用renameTo=.../bar2/file2这会导致

 RNFR foo/bar/file1
 RNTO foo/bar/../bar2/file2

当使用绝对名称时,这将导致

 RNFR foo/bar/file1
 RNTO /bar2/file2

根据FTP服务器的类型和设置,绝对名称可能会被解释为相对于用户主目录的根目录,或者它可能是一个真正的绝对路径。因此,最好只使用相对路径,而.../dir/的解决方案应该适用于Mono和“real”。NET。

 类似资料:
  • 问题内容: 我的目标是每当文件滚动到此滚动文件时,该文件也会移动到另一个目录,因此在原始目录中始终只有。这可能使用吗?还是默认库中的另一个appender ? 问题答案: 我想你的意思是来自Log4J 如果您使用版本> = 1.2.16和log4j-extras,则可以使用此版本 重要的是 但是您必须确保该文件夹(在此示例中存在

  • 我使用SSH SFTP采样器在jmeter中进行SFTP测试。我可以将文件从Ftp位置获取/Put到本地位置,反之亦然。但我无法将文件从同一FTP位置的一个目录移动到另一个目录。 请建议。

  • 我正在使用QT,我无法找到如何将文件从一个目录复制到另一个目录?我怎样才能做到这一点?

  • 我的应用程序中有一个rails自定义记录器。 路径-/ /current/log 文件-custom.json custom.json.20210712 这是我的要求 旋转后的文件应该放在不同的位置,即/ /current/log/archive/custom.json.20210712 旋转文件的名称也应该有hour和min,也就是说,我需要,而不是。格式化

  • mv 命令(move 的缩写),既可以在不同的目录之间移动文件或目录,也可以对文件和目录进行重命名。该命令的基本格式如下: [root@localhost ~]# mv 【选项】 源文件 目标文件 选项: -f:强制覆盖,如果目标文件已经存在,则不询问,直接强制覆盖; -i:交互移动,如果目标文件已经存在,则询问用户是否覆盖(默认选项); -n:如果目标文件已经存在,则不会覆盖移动,而且不询问用户