首页 > 解决方案 > 如何使用 WinSCP 通过 SFTP 下载 10 个最新的 CSV 类型文件?

问题描述

我基本上从 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 站点上的“一些”CSV seesion.GetFiles(),因为remotePath参数是字符串而不是列表。我知道我可以遍历路径列表并从 FTP 下载这些路径,这是一种合理的方法吗?考虑到它似乎专门被命名为文件,我不确定我是否要GetFiles()多次调用,而且我知道它确实会一次下载多个文件。

标签: c#.netsftpwinscpwinscp-net

解决方案


使用您找到的代码下载一个最新文件,然后替换FirstOrDefaultTake迭代该集合以下载所有选定的文件。

我也在使用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();
}

推荐阅读