我在使用以下代码重命名FTP文件时遇到问题:
Dim Request As FtpWebRequest = DirectCast(WebRequest.Create(New Uri("ftp://sftp.mycompany.com/myfile.txt")), FtpWebRequest)
'Set that we will be renaming a file
Request.Method = WebRequestMethods.Ftp.Rename
'Provide the new filename
Request.RenameTo = NewFileName
'The credentials needed to log onto the server
Request.Credentials = New NetworkCredential("username", "password")
'We are going to enable SSL for the communication with the FTP server as required by the remote server.
Request.EnableSsl = True
Request.UsePassive = True
Request.KeepAlive = False
'Create a Response object getting the downloaded file
Dim Response As FtpWebResponse = DirectCast(Request.GetResponse(), FtpWebResponse)
Response.Close()
我从来没有让它工作或需要重命名FTP文件,直到.NET 4.0,这是我写的第一个代码。这个代码的紧密衍生工具,用于下载文件WORKS,因此它不是SSL或FTP问题(请继续阅读详细信息)显然,虽然此代码已记录在Framework 3.5或之前版本中。在VS.NET 2010 .NET Framework 4.0项目中,我总是回来:“远程服务器返回错误:(550)文件不可用(例如,找不到文件,无法访问)。”
猜猜是什么......将确切的代码复制到旧的VS.NET 2008测试项目中再次运行 - >工作得很好!
所以我想我只是将这个代码包装在一个针对3.5 Framework的二进制文件中,然后在我的VS.NET 2010项目中引用它来超越bug,但它没有用。
我尝试添加一个解决方法,我发现在文件名中添加前缀“%2E /”并不适用于我。我的跟踪日志保持输出相同的结果:
System.Net信息:0:[2228] FtpControlStream#15409429 - 收到回复[257“/ users / company”是当前目录]
System.Net信息:0:[2228] FtpControlStream#15409429 - 发送命令 [RNFR /myfile.txt]
System.Net信息:0:[2228] FtpControlStream#15409429 - 收到回复[550文件/myfile.txt未找到]
VS.NET 2008在重命名文件之前省略了第一个斜杠的结果不同:
System.Net信息:0:[6460] FtpControlStream#40715158 - 收到回复[257“/ users / company”是当前目录]
System.Net信息:0:[6460] FtpControlStream#40715158 - 发送命令[CWD / users / company /]
System.Net信息:0:[6460] FtpControlStream#40715158 - 收到回复[250命令CWD成功]
System.Net信息:0:[6460] FtpControlStream#40715158 - 发送命令 [RNFR myfile.txt]
System.Net信息:0:[6460] FtpControlStream#40715158 - 收到回复[350输入新名称]
System.Net信息:0:[6460] FtpControlStream#40715158 - 发送命令[RNTO myfileOLD.txt]
System.Net信息:0:[6460] FtpControlStream#40715158 - 收到回复[250已重命名]
除了在VS.NET 2008或之前运行时,我已尝试过各种组合并且无法正常工作。这听起来像是一个错误或无证的程序更改,可能需要在connect.microsoft.com上保证输入。
对此有何帮助或建议?
谢谢!
答案 0 :(得分:3)
我在forum
中看到了这句话如果URI的格式为“ftp://contoso.com/%2fpath”(%2f是转义'/'),那么URI是绝对的,当前目录是/path.'
我有这样的事情:
Dim _request As FtpWebRequest = DirectCast(WebRequest.Create(New Uri("ftp://xxx.xxx.xxx.xx/%2fremotedirectory/filename.txt")), FtpWebRequest)
我想将文件移至remotedirectory/archive/filename.txt
所以一旦我发出了ftp请求,我就在了remotedirectory目录中,所以我能够完成这样的目标:
_request.RenameTo = "/archive/filename.txt"
我不再遇到550错误。
答案 1 :(得分:2)
上述答案对我不起作用。 这些都不适合我:
在我的情况下实际发生的事情是我希望我的文件移动到的完整路径被添加到旧路径,好像是文件当前位置的相对位置。 例如我在ftp://127.0.0.1/usr/john/temp/file.fmf有一个文件,我想将其移至ftp://127.0.0.1/usr/mary/archive/file.fmf。我使用过(这在.Net Framework 3.5及之前的版本中使用过):
FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://127.0.0.1/usr/john/temp/file.fmf"));
ftp.Credentials = new NetworkCredential(this.UserName, this.Password);
ftp.KeepAlive = true;
ftp.UsePassive = true;
ftp.Method = WebRequestMethods.Ftp.Rename;
ftp.RenameTo = "usr/mary/archive/file.fmf";
ftp.UseBinary = true;
FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
但不在.Net Framework 4.0中。 在System.Net跟踪中,我发现我试图将文件替换为usr / john / temp / usr / mary / archive / file.fmf。这个位置确实不存在。所以我将RenameTo改为相对路径:
ftp.RenameTo = "../../mary/archive/file.fmf";
同样,该文件已移至新位置。
虽然我认为这仅仅是解决方法,而不是作为解决方案,虽然我不知道真正解决它,但我很高兴再次工作。
答案 2 :(得分:1)
好的,我有一个解决方法。正如您所看到的,VS.NET 2008版本还发出了一个更改目录命令:“VSD / users / company /”在VS.NET 2010版本中是 not 。 未记录(至少从我读到的内容)但可行的解决方案是在请求URI中仅使用 /%2f 转义字符解析为的文件夹之间登录服务器时的当前目录。基本上我必须明确并提供绝对路径,仅在默认文件夹位置之间使用这些特殊转义字符。新的URL请求代码行如下:
Dim Request As FtpWebRequest = DirectCast(WebRequest.Create(New Uri("ftp://sftp.mycompany.com/%2fusers/%2fcompany/myfile.txt")), FtpWebRequest)
我认为这可能只是一个问题,对于那些登录到FTP服务器的人来说,你会自动解析为默认目录,甚至可能不会在请求URI中提供该目录。