代码之家  ›  专栏  ›  技术社区  ›  Zach Smith

如何使用winscp通过sftp下载10个csv类型的最新文件?

  •  1
  • Zach Smith  · 技术社区  · 6 年前

    我基本上是用C的winscp。例如,我知道可以使用以下代码从ftp站点下载几个csv文件:

    var remotePath = "some\path*.csv";
    var localPath = "some\path";
    TransferOperationResult transferResult =
        session.GetFiles(remotePath, localPath, false, transferOptions);
    

    但是这会从sftp站点下载所有的csv。我只想要最新的10个。我从这个链接看到: https://winscp.net/eng/docs/script_download_most_recent_file 如何获取最新文件。我发现使用智能感知 RemoteFileInfoCollection 班级。

    但是这个类没有很好的文档记录(或者至少对我来说还不够好)

    问题:

    1. 我怎么用这个班?
    2. 如何在sftp站点上使用 seesion.GetFiles() ,因为 remotePath param是字符串而不是列表。我知道我可以循环浏览路径列表并从ftp下载这些路径,这是一种合理的方法吗?我不确定我会打电话给你 GetFiles() 多次考虑到它似乎特别命名为文件,我知道它确实一次下载多个文件。
    1 回复  |  直到 6 年前
        1
  •  1
  •   Martin Prikryl    6 年前

    使用代码 you have found to download the one latest file 只需更换 FirstOrDefault 具有 Take 并迭代集合以下载所有选定的文件。

    我也在使用 EnumerateRemoteFiles 而不是 ListDirectory ,因为它可以根据自己的文件屏蔽来过滤文件。

    const string remotePath = "/remote/path";
    const string localPath = "C:\local\path";
    
    IEnumerable<RemoteFileInfo> files =
        session.EnumerateRemoteFiles(remotePath, "*.csv", EnumerationOptions.None)
        .Where(file => !file.IsDirectory)
        .OrderByDescending(file => file.LastWriteTime)
        .Take(10);
    
    string destPath = Path.Combine(localPath, "*");
    foreach (RemoteFileInfo file in files)
    {
        Console.WriteLine("Downloading {0}...", file.Name);
        session.GetFiles(RemotePath.EscapeFileMask(file.FullName), destPath).Check();
    }