服务器上存在文件,但列表目录命令未返回

Files exist on server but are not returned by list directory command

我正在使用 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 或批处理,但并不理想。

看起来 FluentFTP 可以通过将列表选项设置为 FtpListOption.AllFiles 来处理这个问题。

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

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

这个库也支持下载。

更新:根据已接受的答案,WinSCP 可以通过将 ftpListAll 设置为 0..

来正确处理此问题

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

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

或者您可以使用 WinsCP GUI generate the code template


FtpWebRequest 一起,将 -a 添加到 URL。