【问题标题】:Multiple file mask for WinSCP Session.EnumerateRemoteFilesWinSCP Session.EnumerateRemoteFiles 的多个文件掩码
【发布时间】:2017-08-22 19:16:43
【问题描述】:

我正在重建系统监视器应用程序的 FTP 部分,必须能够下载以下任何文件:

  • .csv
  • .xlsx
  • .xls

当我尝试设置该掩码时,它返回 0 个文件,但如果我只选择其中一个,它会完美运行。

string FileMask = "*.csv; *.xlsx; *.xls";

var sessionOptions = new SessionOptions
{
    Protocol = Protocol.Sftp,
    HostName = ConfigurationManager.AppSettings["FtpHost"],
    UserName = ConfigurationManager.AppSettings["FtpUsr"],
    Password = ConfigurationManager.AppSettings["FtpPwd"],
    SshHostKeyFingerprint = ConfigurationManager.AppSettings["SshHostKeyFingerprint"]
};

using (Session session = new Session())
{
    session.Open(sessionOptions);

    List<string> files =
        session.EnumerateRemoteFiles("/", FileMask, EnumerationOptions.AllDirectories)
        .Select(fileInfo => fileInfo.FullName)
        .ToList();

    Console.WriteLine($"Found {files.Count} files");
}

我已经尝试了几件事,但都没有按照我想要的方式工作。

【问题讨论】:

    标签: c# .net ftp winscp winscp-net


    【解决方案1】:

    mask argument of Session.EnumerateRemoteFiles 是 Windows 通配符。无法使用 Windows 通配符匹配多个扩展。

    但您可以自己过滤文件。例如使用正则表达式:

    Regex mask = new Regex(@"\.(csv|xls|xlsx)$", RegexOptions.IgnoreCase);
    List <string> files =
        session.EnumerateRemoteFiles("/", null, EnumerationOptions.AllDirectories)
        .Where(fileInfo => mask.Match(fileInfo.Name).Success)
        .Select(fileInfo => fileInfo.FullName)
        .ToList();
    

    【讨论】:

    • 太棒了,这就是我需要的,有没有办法让它忽略某个子文件夹?我注意到它在一个用作我需要忽略的常规 packrat 文件夹的子文件夹中。
    • 同理。使用Where扩展方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    相关资源
    最近更新 更多