【问题标题】:How do you change directories using FtpWebRequest (.NET)?如何使用 FtpWebRequest (.NET) 更改目录?
【发布时间】:2010-09-24 17:09:58
【问题描述】:

谁能告诉我如何使用 FtpWebRequest 更改目录?这似乎应该是一件容易的事,但我没有看到它。

编辑

我只是想补充一下...我对 FtpWebRequest 没有兴趣。如果有更好(更简单)的方式在 .NET 中执行 FTP,请告诉我。


显然没有办法使用实时连接来做到这一点,您需要更改 uri 以欺骗 ftpwebrequest 使用不同的请求(感谢 Jon)。

所以我正在寻找第 3 方客户...

我尝试过的一些开源解决方案效果不佳(一直崩溃),但我发现一个开源解决方案通过了我的一些初步测试 (.NET FTP Client)。

【问题讨论】:

    标签: .net ftp ftpwebrequest


    【解决方案1】:

    有一个来自 Mariya Atanasova 的 blog post,它展示了如何伪造它 - 基本上你必须将目录放在 URL 上。

    我怀疑使用专用的 FTP 库可能会更好 - 一个不会试图将所有内容都强制转换为 WebRequest 做事方式的库。我个人没有为此使用任何 3rd 方库,但搜索“FTP library .NET”会发现很多候选者。


    编辑:jcolebrand(以防 2006 年博客 linkrot 的可能性)

    许多客户询问我们如何将 CWD 命令与我们的 FtpWebRequest 一起使用。

    答案是:不能直接使用命令,但是可以修改uri参数达到同样的效果。

    假设您使用以下格式:

    String uri = "ftp://myFtpUserName:myFtpUserPassword@myFtpUrl";
    FtpWebRequest Request = (FtpWebRequest)WebRequest.Create(uri);
    Request.Method = "LIST";
    

    以上示例将带您进入用户目录并列出其中的所有内容。现在假设您想向后移动 2 个目录并列出其中的内容(前提是您的用户有权执行此操作)。您关闭之前的 FtpWebRequest 并使用此 uri 发出新的请求

    uri = "ftp://myFtpUserName:myFtpUserPassword@myFtpUrl/%2E%2E/%2E%2E";
    

    这相当于使用您的用户凭据登录,然后使用cd ../../

    注意:如果您尝试直接使用 ”..” 而不转义它们,则 uri 类将删除它们,因此 "ftp://myFtpUserName:myFtpUserPassword@myFtpUrl/../.." 等效于 "ftp://myFtpUserName:myFtpUserPassword@myFtpUrl/"

    现在假设您要转到另一个用户的目录,该目录比根目录高一级。如果您不指定用户名和密码,则相当于以匿名用户身份登录。然后您使用以下 uri 发出一个新的FtpWebRequest

    "ftp://myFtpUrl/%2F/anotherUserDir"
    

    这相当于匿名登录然后做

    Cd /
    cd anotherUserDirectory
    

    【讨论】:

    • 我尝试从 codeproject 开源库,当连接到 filezilla ftp 服务器时,它们都给了我很多问题(不知道它们在 iis ftp 服务器上的工作情况如何)。我想我可能不得不购买一个组件。不过感谢您的回答。
    • 无论您使用什么客户端库,都应尽快更改为被动模式,前提是它为您提供了选项。这更有可能通过防火墙等工作。
    • 我发现标记答案中描述的方法存在问题。我们使用的密码里面有一个@符号,这会导致整个事情失败。任何 FTP 工具允许首先描述目标目录,然后是目标文件以上传文件?当然,问题是用户配置了不同的主目录。
    【解决方案2】:

    你必须关闭当前连接:

    request.Close();
    

    然后用另一个 uri 打开一个新的:

    uri = "ftp://example.com/%2F/directory" //Go to a forward directory (cd directory)
    uri = "ftp://example.com/%2E%2E" //Go to the previously directory (cd ../)
    
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri);
    

    【讨论】:

      【解决方案3】:

      您可以使用 FtpWebRequest 的 ListDirectoryDe​​tails 方法,而不是使用 FTPWebRequest 的 ListDirectory 方法。

      从中您可以使用正则表达式来获取您想要的值。 就是这样,在我的情况下它对我来说很好用

      【讨论】:

        猜你喜欢
        • 2013-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-04
        • 2015-11-06
        相关资源
        最近更新 更多