Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将文件移动到另一个Ftp目录并重命名_C#_.net_Ftp_Rename_File Move - Fatal编程技术网

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

C# 将文件移动到另一个Ftp目录并重命名,c#,.net,ftp,rename,file-move,C#,.net,Ftp,Rename,File Move,在过去的几个小时里,我一直在努力解决这个问题,如果不再次下载和上传文件,我真的找不到一个方法来解决这个问题。有可能吗 这个问题有点像是这个问题的复制品:但我感觉它没有解决,尽管它已经得到了回答 重命名文件本身非常容易,并且没有任何问题,但是如何将其移动到另一个目录 我有以下示例代码: string uri2 = "ftp://ftpUser@testFtp.com/mainFolder/moveFrom/file.txt"; f = (FtpWebRequest)FtpWebRequest.C

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

这个问题有点像是这个问题的复制品:但我感觉它没有解决,尽管它已经得到了回答

重命名文件本身非常容易,并且没有任何问题,但是如何将其移动到另一个目录

我有以下示例代码:

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次调用。

.NET在FTP协议上设置了一个抽象层,它可以抽象太多内容,从而使某些事情变得不可能或棘手。我没有.NET的源代码,但基于(一种尝试与.NET兼容的实现)它将对URI上的任何操作执行以下操作:

  • 首先将URI拆分为目录部分和文件名部分(请参阅源代码中的
    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
 RNFR foo/bar/file1
 RNTO /bar2/file2
这可能适用于Mono实现,但我不知道它是否也适用于real.NET

编辑: 我刚刚看了一下。它与Mono的不同之处在于,它在文件操作之前不会对basedir执行CWD,而是在名称相对的情况下将当前basedir前置到名称。因此,使用
rename to=../bar2/file2
这会导致

 RNFR foo/bar/file1
 RNTO foo/bar/../bar2/file2
如果使用绝对名称
renameTo=/bar2/file2
,则会导致

... log into host ...
CWD foo/bar
RNFR file1
RNTO ../bar2/file2
 RNFR foo/bar/file1
 RNTO /bar2/file2

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

您确定文件路径是正确的,即文件确实在那里吗?是的,文件在那里,我可以在浏览器中打开它。您尝试使用的是什么相对路径?您是否尝试过
/mainfolder/moveFrom/file.txt
/mainfolder/moveTo/file.txt
我刚刚测试了.NET 4.0上@steffen的相对路径建议,这是一个d它起作用了。它导致了与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”