代码之家  ›  专栏  ›  技术社区  ›  atconway

仅在.NET Framework 4.0中重命名FTP服务器上的文件时出现问题!

  •  4
  • atconway  · 技术社区  · 14 年前

        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()
    

    在.NET 4.0之前,我从来没有真正运行过或需要重命名FTP文件,所以这是我编写的第一个代码。下载该文件所需的这段代码的一个非常接近的派生版本可以工作,因此它不是SSL或FTP问题(请继续阅读以获取跟踪详细信息),尽管这段代码被记录在Framework 3.5或更早版本中。在VS.NET 2010.NET Framework 4.0项目中,我总是返回:“远程服务器返回一个错误:(550)文件不可用(例如,找不到文件,无法访问)。”

    猜猜看。。。将准确的代码复制到旧的VS.NET 2008测试项目中,再次运行它->工作正常!

    所以我想我应该把这段代码包装成一个针对3.5框架的二进制代码,然后在我的VS.NET 2010项目中引用它,以使bug更聪明,但它没有起作用。

    我试图添加一个解决方法,但发现声明在文件名中添加前缀“%2E/”对我不起作用。我的跟踪日志一直输出相同的结果:

    系统.Net信息:0:[2228]FtpControlStream#15409429-收到的响应[257“/用户/公司”是当前目录]
    系统.Net信息:0:[2228]FtpControlStream#15409429-发送命令 [RNFR/myfile.txt]
    系统.Net信息:0:[2228]FtpControlStream#15409429-收到响应[550 File/myfile.txt未找到]

    VS.NET 2008在重命名文件前的第一个斜杠处有不同的结果:

    系统.Net信息:0:[6460]FtpControlStream#40715158-收到的响应[257“/users/company”是当前目录]
    系统.Net信息:0:[6460]FtpControlStream#40715158-发送命令[CWD/users/company/]
    系统.Net信息:0:[6460]FtpControlStream#40715158-收到响应[250命令CWD成功]
    系统.Net信息:0:[6460]FtpControlStream#40715158-发送命令 [RNFR myfile.txt]
    系统.Net信息:0:[6460]FtpControlStream#40715158-收到响应[350输入新名称]
    系统.Net信息:0:[6460]FtpControlStream#40715158-正在发送命令[RNTO myfileOLD.txt]
    系统.Net信息:0:[6460]FtpControlStream#40715158-已收到响应[250已重命名]

    我已经尝试了所有的组合,但不能让这个工作,除非运行在VS.NET 2008或之前。这听起来确实像是一个bug或未经记录的过程更改,可能需要在connect.microsoft.com上输入一个条目。

    对此有什么帮助或建议吗?

    谢谢!

    3 回复  |  直到 14 年前
        1
  •  3
  •   LarsTech    13 年前

    我在 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的错误了。

        2
  •  2
  •   Dev.Jaap    13 年前

    上面描述的答案对我不起作用。 这些对我也没用:

    在我的例子中,我希望文件移动到的完整路径被添加到旧路径,就好像是文件当前位置的相对位置一样。 e、 g.我在 ftp://127.0.0.1/usr/john/temp/file.fmf 我想把它移到 ftp://127.0.0.1/usr/mary/archive/file.fmf . 我使用了(这在.NETFramework3.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();
    

    但不在.NETFramework4.0中。 在System.Net跟踪中,我发现我试图将文件替换为usr/john/temp/usr/mary/archive/file.fmf。这个位置确实不存在。因此,我将重命名更改为相对路径:

            ftp.RenameTo = "../../mary/archive/file.fmf";
    

    再次,文件被移到新的位置。

    虽然我认为这只是一个解决办法,而不是解决办法,虽然我不知道如何真正解决它,但我很高兴它再次发挥作用。

        3
  •  1
  •   atconway    14 年前

    好的,我有工作要做。如您所见,VS.NET 2008版本还发出一个更改目录命令:“CWD/users/company/”,即 在VS.NET 2010版本中发布。这个 无证 (至少从我读到的)但可行的解决方案是使用 /%二楼 请求URI中的转义字符只在登录到服务器时解析为当前目录的文件夹之间。本质上,我必须显式地给出一个绝对路径,只在默认文件夹位置之间使用这些特殊的转义字符。新的URL请求代码行如下所示:

    Dim Request As FtpWebRequest = DirectCast(WebRequest.Create(New Uri("ftp://sftp.mycompany.com/%2fusers/%2fcompany/myfile.txt")), FtpWebRequest)
    

    我相信这可能只是登录到FTP服务器的用户会遇到的一个问题,在FTP服务器上,您会自动被解析为默认目录,甚至可能不会在请求URI中提供该目录。