Файлы существуют на сервере, но не возвращаются командой списка каталогов

Я использую пакет WinSCP .NET NuGet для доступа к стороннему FTP-серверу, над которым я не контролирую.

Проблема: кажется, что после первоначальной команды LIST (в которой перечислены все файлы) сервер больше не отображает файлы, присутствующие в каталоге, а только подкаталоги. Однако, если я открою тот же FTP-каталог в FireFox или FileZilla, файлы появятся. Напротив, сам инструмент WinSCP не перечисляет файлы.

Похоже, что WinSCP подчиняется директиве сервера не перечислять эти файлы. Встроенная библиотека .NET FTP (FtpWebRequest) имеет точно такое же ограничение.

Код, который я использую для доступа к серверу, приведен ниже:

public class FTP
{
    private SessionOptions opts = new SessionOptions();

    public FTP(string _userName, string _password, string _server)
    {
        opts.UserName = _userName;
        opts.Password= _password;
        opts.HostName = _server;
        opts.Protocol = Protocol.Ftp;
        opts.FtpMode = FtpMode.Passive;       
    }        

    public string[] GetFiles(string directory)
    {
        try
        {
            using (Session session = new Session())
            {
                session.Open(opts);

                RemoteDirectoryInfo dir = session.ListDirectory(directory);
                return dir.Files.Where(x => !x.IsDirectory).Select(x => x.Name).ToArray();
            }
        }
        catch (Exception)
        {
            throw;
        }
    }
}

Есть ли обходной путь в WinSCP (или, альтернативно, в другой библиотеке C#), который может правильно справиться с этой ситуацией?

Внешний процесс, такой как PowerShell или пакетная обработка, приемлем, но не идеален.


person vbnet3d    schedule 17.07.2017    source источник


Ответы (2)


Для сборки WinSCP .NET необходимо установить для параметра FtpListAll значение 0 (=on) :

opts.AddRawSettings("FtpListAll", "0");

Или вы можете сделать так, чтобы графический интерфейс WinsCP сгенерировал шаблон кода для вас.


С помощью FtpWebRequest добавьте -a к URL-адресу.

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

person Martin Prikryl    schedule 21.07.2017

Похоже, что FluentFTP может справиться с этой проблемой, если для параметра списка установлено значение FtpListOption.AllFiles.

Я использовал следующий код и успешно перечислил файлы:

FtpListItem[] files = ftp.GetListing(path, FtpListOption.AllFiles)
                .Where(x => x.Type == FtpFileSystemObjectType.File)
                .OrderBy(x => x.Modified)
                .ToArray();

Эта библиотека также поддерживает загрузку.

ОБНОВЛЕНИЕ: Согласно принятому ответу, WinSCP может правильно обработать это, если для ftpListAll установлено значение 0..

person vbnet3d    schedule 17.07.2017