WinSCP Session.EnumerateRemoteFiles带时间约束掩码失效求助
解决SFTP筛选24小时内新文件的问题
你的问题核心在于大部分SFTP客户端库的EnumerateRemoteFiles方法不支持带时间条件的扩展掩码语法(比如*.xml>24HS),这类语法通常是特定工具(如WinSCP图形界面)的自定义扩展,并非标准SFTP协议或通用库的支持特性,所以直接用这个掩码会返回空列表。
可行的解决方案
先枚举所有符合*.xml的文件,再在客户端本地筛选出24小时内的文件,之后逐个验证下载:
- 枚举所有XML文件:用
*.xml掩码获取完整的文件列表,这一步你已经能正常执行。 - 筛选时间范围内的文件:遍历列表,对比文件的最后修改时间与当前时间的差值,保留24小时以内的文件。
- 逐个验证并下载:对筛选后的文件执行你的验证逻辑,通过后再下载。
代码示例(以WinSCP .NET库为例)
// 枚举远程路径下所有XML文件 var allXmlFiles = session.EnumerateRemoteFiles("/your/remote/dir", "*.xml", EnumerationOptions.None); // 计算24小时前的时间节点(统一用UTC避免时区偏差) var cutoffUtc = DateTime.UtcNow.AddHours(-24); // 筛选最近24小时修改的文件(转UTC时间对比) var recentFiles = allXmlFiles.Where(file => file.LastWriteTimeUtc >= cutoffUtc); // 遍历处理每个文件 foreach (var file in recentFiles) { // 执行你的自定义验证逻辑,比如检查文件大小、读取内容校验等 bool isFileValid = YourValidationLogic(session, file); if (isFileValid) { // 验证通过,下载文件 session.GetFiles(file.FullName, @"C:\your\local\dir\*").Check(); } }
关键注意事项
- 时区统一:务必将本地时间和服务器文件时间统一为UTC(或同一时区),否则会因时区差导致筛选结果错误。
- 性能考量:9000+文件的遍历筛选在客户端执行完全可行,若担心耗时,可考虑分批枚举,但通常无需额外优化。
- 时间属性选择:根据需求选择
LastWriteTimeUtc(最后修改时间)或CreationTimeUtc(创建时间),部分SFTP服务器可能不返回创建时间,优先用修改时间。
内容的提问来源于stack exchange,提问作者Redzix
相关产品推荐
相关产品推荐

