FtpWebRequest ListDirectory не возвращает скрытые файлы

Использование FtpWebRequest для отображения содержимого каталога; однако он не показывает скрытые файлы.

Как заставить его показывать скрытые файлы?

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

FileZilla правильно перечисляет скрытые файлы, поэтому я знаю, что FTP-сервер возвращает ему эти данные. Мне просто нужно воспроизвести это с помощью FtpWebRequest. Или используйте для этого другую библиотеку.


person Tomas Beblar    schedule 24.02.2017    source источник
comment
Делает ли ListDirectoryDetails то, что вы хотите? Документация MSDN по нему очень скудна.   -  person Brendan Green    schedule 24.02.2017
comment
Покажите нам подробный файл журнала FileZilla. И попробуйте ListDirectoryDetails, как предложил Брендан.   -  person Martin Prikryl    schedule 24.02.2017
comment
ListDirectoryDetails также не возвращает скрытые файлы.   -  person Tomas Beblar    schedule 24.02.2017


Ответы (2)


FtpWebRequest, предоставляемый Microsoft, не выполняет всех операций, необходимых для вывода каталогов сайтов FTP, FTPS или SFTP.

Хорошим решением было бы использование некоторых других dll, таких как WinScp, Ftp.dll, которые могут предоставить вам некоторые эффективные и дополнительные функции.

person Jothi Prakash Anandan    schedule 24.02.2017
comment
В итоге я использовал FluentFTP nuget.org/packages/FluentFTP, у которого есть возможность отображать скрытые файлы. вот так: client.GetListing(path, FtpListOption.AllFiles); - person Tomas Beblar; 24.02.2017

Некоторые FTP-серверы не включают скрытые файлы в ответы на команды LIST и NLST (которые стоят за ListDirectoryDetails и ListDirectory).

Одним из решений является использование команды MLSD, которой FTP-серверы действительно возвращают скрытые файлы. В любом случае, команда MLSD является единственно правильным способом общения с FTP-сервером, так как ее формат ответа стандартизирован (чего нельзя сказать о LIST).

Но .NET framework/FtpWebRequest не поддерживает команду MLSD.

Для этого вам придется использовать другую стороннюю библиотеку FTP.

Например, с сборкой WinSCP .NET вы можете использовать:

// 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.

WinSCP будет использовать MLSD, если сервер это поддерживает. Если нет, он попытается использовать трюк -a (описанный ниже).

(я автор WinSCP)


Если вы застряли с FtpWebRequest, вы можете попробовать использовать переключатель -a с командой LIST/NLST. Хотя это не стандартный переключатель (в FTP нет переключателей), многие FTP-серверы распознают его. И это заставляет их возвращать скрытые файлы.

Чтобы обмануть FtpWebRequest и добавить переключатель -a в команду LIST/NLST, добавьте его в URL-адрес:

WebRequest.Create("ftp://ftp.example.com/remote/path/ -a");
person Martin Prikryl    schedule 15.06.2017