【问题标题】:FtpWebRequest ListDirectory does not return hidden filesFtpWebRequest ListDirectory 不返回隐藏文件
【发布时间】:2017-02-24 01:57:35
【问题描述】:

使用FtpWebRequest 列出目录的内容;但是,它没有显示隐藏文件。

如何让它显示隐藏文件?

FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftp_root + path);
request.Method = WebRequestMethods.Ftp.ListDirectory;

FileZilla 正确列出了隐藏文件,因此我知道 FTP 服务器正在将这些数据返回给它。我只需要用FtpWebRequest 复制它。或者为它使用不同的库。

【问题讨论】:

  • ListDirectoryDetails 做你想做的事吗?关于它的 MSDN 文档非常稀少。
  • 向我们展示详细的 FileZilla 日志文件。按照 Brendan 的建议,试试 ListDirectoryDetails
  • ListDirectoryDe​​tails 也没有返回隐藏文件。

标签: c# .net ftp file-handling ftpwebrequest


【解决方案1】:

Microsoft 提供的FtpWebRequest 不执行列出 FTP、FTPS 或 SFTP 站点目录所需的所有操作。

一个好的解决方案是使用一些其他的 dll,例如 WinScp、Ftp.dll,它们可以为您提供一些高效和额外的功能。

【讨论】:

  • 我最终使用了 FluentFTP nuget.org/packages/FluentFTP,它可以选择列出隐藏文件,如下所示:client.GetListing(path, FtpListOption.AllFiles);
【解决方案2】:

某些 FTP 服务器未能包含隐藏文件以响应 LISTNLST 命令(位于 ListDirectoryDetailsListDirectory 后面)。

一种解决方案是使用MLSD 命令,FTP 服务器会向该命令返回隐藏文件。不管怎样,MLSD 命令是与 FTP 服务器通信的唯一正确方式,因为它的响应格式是标准化的(LIST 不是这种情况)。

但是.NET framework/FtpWebRequest不支持MLSD命令。

为此,您必须使用不同的第 3 方 FTP 库。

例如 WinSCP .NET assembly 你可以使用:

// Setup session options
SessionOptions sessionOptions = new SessionOptions
{
    Protocol = Protocol.Ftp,
    HostName = "ftp.example.com",
    UserName = "user",
    Password = "mypassword",
};

using (Session session = new Session())
{
    // Connect
    session.Open(sessionOptions);

    RemoteDirectoryInfo directory = session.ListDirectory("/remote/path");

    foreach (RemoteFileInfo fileInfo in directory.Files)
    {
        Console.WriteLine(
            "{0} with size {1}, permissions {2} and last modification at {3}",
            fileInfo.Name, fileInfo.Length, fileInfo.FilePermissions,
            fileInfo.LastWriteTime);
    }
}

请参阅Session.ListDirectory method 的文档。

如果服务器支持,WinSCP 将使用MLSD。如果没有,它将尝试使用-a 技巧(如下所述)。

(我是 WinSCP 的作者)


如果你被FtpWebRequest卡住了,你可以尝试使用-a开关和LIST/NLST命令。虽然这不是任何标准开关(FTP 中没有开关),但许多 FTP 服务器确实可以识别它。它使它们返回隐藏文件。

要欺骗FtpWebRequest-a 开关添加到LIST/NLST 命令,请将其添加到 URL:

WebRequest.Create("ftp://ftp.example.com/remote/path/ -a");

【讨论】:

    猜你喜欢
    • 2017-10-28
    • 2013-07-02
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    • 2012-06-27
    • 1970-01-01
    相关资源
    最近更新 更多