You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用WinSCP通过SFTP下载最新10个CSV文件?C#实现疑问

嗨,我来帮你搞定这个WinSCP的需求~针对你的两个疑问,我一步步给你讲清楚:

1. 如何使用RemoteFileInfoCollection类?

这个类本质就是远程文件信息的集合,每个元素RemoteFileInfo包含了文件的修改时间、文件名、大小、权限等元数据,核心用途就是帮你筛选、排序远程文件,精准定位到你需要的内容。

你可以通过session.ListDirectory()方法先获取指定目录下的所有文件/文件夹,再过滤出CSV文件,接着按修改时间倒序排序,最后取前10个最新的。代码示例如下:

// 指定远程目录路径
string remoteDir = "some/path";
// 获取远程目录的所有文件信息
RemoteDirectoryInfo dirInfo = session.ListDirectory(remoteDir);
// 筛选出CSV文件,按修改时间倒序排列,取前10个
var latest10CsvFiles = dirInfo.Files
    .Where(file => !file.IsDirectory && file.Name.EndsWith(".csv", StringComparison.OrdinalIgnoreCase))
    .OrderByDescending(file => file.LastWriteTime)
    .Take(10)
    .ToList();

这里latest10CsvFiles就是你需要的文件集合(本质是List<RemoteFileInfo>,和RemoteFileInfoCollection用法完全一致),你可以遍历它拿到每个文件的具体信息。

2. 如何用session.GetFiles()下载部分CSV文件?循环调用是否合理?

session.GetFiles()remotePath参数确实只接受字符串,但你有两种可行的方式下载选中的文件:

方式一:循环调用GetFiles()(推荐,直观易维护)

循环下载每个选中的文件是完全合理的!因为WinSCP的Session对象是保持长连接的,每次调用GetFiles()不会重新建立连接,10次循环的开销几乎可以忽略,而且这种方式方便你单独处理每个文件的下载结果(比如记录日志、处理单个文件的下载错误)。

代码示例:

string localDir = "some/path";
TransferOptions transferOptions = new TransferOptions();
// 根据你的需求设置传输选项,比如覆盖规则、传输模式
transferOptions.OverwriteMode = OverwriteMode.OverwriteIfNewer;
transferOptions.TransferMode = TransferMode.Binary;

foreach (var file in latest10CsvFiles)
{
    // 构造单个文件的远程完整路径
    string remoteFilePath = Path.Combine(remoteDir, file.Name);
    // 下载到本地目录,保留原文件名
    TransferOperationResult result = session.GetFiles(remoteFilePath, Path.Combine(localDir, "*"), false, transferOptions);
    // 检查下载是否有错误
    result.Check();
}

方式二:构造多文件路径字符串一次调用

如果你想一次性下载所有选中的文件,可以把多个远程文件路径用分号;拼接成一个字符串,传给remotePath参数:

// 拼接所有选中文件的远程路径
string remoteFilePaths = string.Join(";", latest10CsvFiles.Select(f => Path.Combine(remoteDir, f.Name)));
// 一次下载所有文件
TransferOperationResult result = session.GetFiles(remoteFilePaths, Path.Combine(localDir, "*"), false, transferOptions);
result.Check();

这种方式减少了方法调用次数,但如果其中一个文件下载失败,整个批次的结果处理会稍微麻烦一点,适合对效率要求稍高且不需要单独处理每个文件的场景。

总的来说,循环调用GetFiles()完全合理,也是最常用的处理方式,尤其针对10个文件的小批量场景,非常好用。

内容的提问来源于stack exchange,提问作者Zach Smith

火山引擎 最新活动