FtpWebRequest ListDirectory不返回隐藏文件

时间:2017-02-24 01:57:35

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

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

如何让它显示隐藏文件?

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

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

1 个答案:

答案 0 :(得分:3)

某些FTP服务器无法将隐藏文件包含在对LISTNLST命令(位于ListDirectoryDetailsListDirectory后面)的响应中。

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

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

为此,您必须使用不同的第三方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命令,请将其添加到网址:

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