文件存在于服务器上但不由列表目录命令

时间:2017-07-17 18:37:00

标签: c# ftp winscp ftpwebrequest winscp-net

我正在使用WinSCP .NET NuGet包来访问我无法控制的第三方FTP服务器。

问题:似乎在初始LIST命令(列出了所有文件)之后,服务器不再列出目录中存在的文件 - 仅副主任。但是,如果我在FireFox或FileZilla中打开相同的FTP目录,则会显示文件。相比之下,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或批处理)是可以接受的,但并不理想。

2 个答案:

答案 0 :(得分:2)

看起来FluentFTP能够通过将列表选项设置为FtpListOption.AllFiles来处理此问题。

我使用了以下代码并成功列出了文件:

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

该库也支持下载。

更新:根据接受的答案,WinSCP可以正确处理此问题,ftpListAll设置为0 ..

答案 1 :(得分:2)

使用WinSCP .NET程序集,您必须将FtpListAll选项设置为0(= on):

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

请参阅https://winscp.net/eng/docs/rawsettings

使用FtpWebRequest,将-a添加到网址。

请参阅FtpWebRequest ListDirectory does not return hidden files