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

С помощью FtpWebRequest составить список содержимого каталога; однако, это не показывает скрытые файлы.

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

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

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

2 ответа

Решение

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

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

Некоторые 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");
Другие вопросы по тегам