Tengo una carpeta en un servidor SFTP que tiene un montón de archivos. Hay 6 archivos diferentes y se crean cada 60 minutos. Cada uno con una marca de fecha y hora, y se mantienen durante 3 días.
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 Estoy creando algunos procesos que se ejecutarán cada hora y seleccionarán un archivo en particular y lo procesarán. Sé que puedo usar Name.StartsWith para obtener el archivo correcto, pero no sé cómo obtener el más reciente. Estaba pensando que se podría usar LastWriteTime , pero no sé cómo compararlo.
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); } Pensé en probar algo como esto para comparar y poner el archivo final en targetFile
if (file.Name.StartsWith(fileNamePat)) { if (file.LastWriteTime > targetFile.LastWriteTime) { targetFile = file; } } Pero no puedo averiguar dónde/cómo crear el SftpFile targetFile para que la comparación funcione. SftpFile targetFile = new(); y pensé que podría verificar si estaba en blanco y luego configurarlo, pero eso no funciona.
Intente usar una lambda en su conjunto de archivos:
foreach (SftpFile file in files.Where(f => f.Name.Contains(fileNamePat)) .OrderByDescending(o => o.LastWriteTime) .Take(1)) { [...] }En realidad no necesitabas un para cada uno. puede obtener su 'objetivo' de lambda:
SftpFile targetFile = files.Where(f => f.Name.Contains(fileNamePat)) .OrderByDescending(o => o.LastWriteTime) .FirstOrDefault();