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