使用 SSH.NET 查找具有特定文件名的最新 SFTP 文件

Find most recent SFTP file with a particular filename using SSH.NET

我在 SFTP 服务器上有一个文件夹,里面有一堆文件。有 6 个不同的文件,每 60 分钟创建一次。每个都有日期和时间戳,并保留 3 天。

FilesCodes_Critical.2022-03-17_11-16-22-614.json
FilesCodes_Critical.2022-03-17_12-12-16-818.json
FilesCodes_Critical.2022-03-17_13-11-43-025.json
TransactionAudit.2022-03-14_11-16-23-530.json
TransactionAudit.2022-03-14_12-12-19-764.json
TransactionAudit.2022-03-14_13-11-45-454.json

我正在创建一些进程,这些进程将每小时 运行 提取一个特定的文件并对其进行处理。我知道我可以使用 Name.StartsWith 来获取正确的文件,但我不知道如何获取最新的文件。本来以为可以用LastWriteTime,但是想不出来怎么比较。

fileNamePat = "FileCodes_Critical";    

try {       
    sftpc.Connect();

    var files = sftpc.ListDirectory(sFTPPath);
    foreach (SftpFile file in files)
    {
        if (file.Name.StartsWith(fileNamePat))
        {
            string jsonData = sftpc.ReadAllText(file.FullName);
            DataSet ds = JsonConvert.DeserializeObject<DataSet>(jsonData);
        }
    }
} catch (Exception ex) {
    Console.WriteLine(ex.Message);
}

我想尝试这样的事情来比较并将最终文件放入 targetFile

if (file.Name.StartsWith(fileNamePat))
{
    if (file.LastWriteTime > targetFile.LastWriteTime)
    {
        targetFile = file;
    }
}

但我无法弄清楚 where/how 来创建 SftpFile targetFile,因此比较将起作用。我尝试了 SftpFile targetFile = new(); 并认为我可以检查它是否为空白然后设置它,但这不起作用。

尝试对您的文件集使用 lambda:

foreach (SftpFile file in files.Where(f => f.Name.Contains(fileNamePat))
                                 .OrderByDescending(o => o.LastWriteTime)
                                   .Take(1)) 
{ 
      [...]
}

其实你并不需要每个。你可以从 lambda 得到你的 'target':

SftpFile targetFile = files.Where(f => f.Name.Contains(fileNamePat))
               .OrderByDescending(o => o.LastWriteTime)
                   .FirstOrDefault();