Ho bisogno di trovare il file modificato più di recente in una directory.
So che posso scorrere ogni file in una cartella e confrontare File.GetLastWriteTime
, ma c’è un modo migliore per farlo senza eseguire il loop ?.
che ne dici di qualcosa del genere…
var directory = new DirectoryInfo("C:\\MyDirectory"); var myFile = (from f in directory.GetFiles() orderby f.LastWriteTime descending select f).First(); // or... var myFile = directory.GetFiles() .OrderByDescending(f => f.LastWriteTime) .First();
Se vuoi cercare ricorsivamente, puoi usare questo bellissimo pezzo di codice:
public static FileInfo GetNewestFile(DirectoryInfo directory) { return directory.GetFiles() .Union(directory.GetDirectories().Select(d => GetNewestFile(d))) .OrderByDescending(f => (f == null ? DateTime.MinValue : f.LastWriteTime)) .FirstOrDefault(); }
Chiamalo nel modo seguente:
FileInfo newestFile = GetNewestFile(new DirectoryInfo(@"C:\directory\"));
e questo è tutto. Restituisce un’istanza FileInfo
o null
se la directory è vuota.
Espandendoti sopra il primo, se vuoi cercare un determinato pattern puoi usare il seguente codice:
string pattern = "*.txt" var dirInfo = new DirectoryInfo(directory); var file = (from f in dirInfo.GetFiles(pattern) orderby f.LastWriteTime descending select f).First();
Una versione non LINQ:
/// /// Returns latest writen file from the specified directory. /// If the directory does not exist or doesn't contain any file, DateTime.MinValue is returned. /// /// Path of the directory that needs to be scanned /// private static DateTime GetLatestWriteTimeFromFileInDirectory(DirectoryInfo directoryInfo) { if (directoryInfo == null || !directoryInfo.Exists) return DateTime.MinValue; FileInfo[] files = directoryInfo.GetFiles(); DateTime lastWrite = DateTime.MinValue; foreach (FileInfo file in files) { if (file.LastWriteTime > lastWrite) { lastWrite = file.LastWriteTime; } } return lastWrite; } /// /// Returns file's latest writen timestamp from the specified directory. /// If the directory does not exist or doesn't contain any file, null is returned. /// /// Path of the directory that needs to be scanned /// private static FileInfo GetLatestWritenFileFileInDirectory(DirectoryInfo directoryInfo) { if (directoryInfo == null || !directoryInfo.Exists) return null; FileInfo[] files = directoryInfo.GetFiles(); DateTime lastWrite = DateTime.MinValue; FileInfo lastWritenFile = null; foreach (FileInfo file in files) { if (file.LastWriteTime > lastWrite) { lastWrite = file.LastWriteTime; lastWritenFile = file; } } return lastWritenFile; }
Breve e semplice :
new DirectoryInfo(path).GetFiles().OrderByDescending(o => o.LastWriteTime).FirstOrDefault();
è un po ‘tardi ma …
il tuo codice non funzionerà, a causa della list
e più tardi lastUpdatedFile.Add(file);
quindi verrà generata l’eccezione NullReference. La versione funzionante dovrebbe essere:
private List GetLastUpdatedFileInDirectory(DirectoryInfo directoryInfo) { FileInfo[] files = directoryInfo.GetFiles(); List lastUpdatedFile = new List (); DateTime lastUpdate = DateTime.MinValue; foreach (FileInfo file in files) { if (file.LastAccessTime > lastUpdate) { lastUpdatedFile.Add(file); lastUpdate = file.LastAccessTime; } } return lastUpdatedFile; }
Grazie
È ansible reactjs alla nuova attività di file con FileSystemWatcher .
Ecco una versione che ottiene il file più recente da ciascuna sottodirectory
List reports = new List (); DirectoryInfo directory = new DirectoryInfo(ReportsRoot); directory.GetFiles("*.xlsx", SearchOption.AllDirectories).GroupBy(fl => fl.DirectoryName) .ForEach(g => reports.Add(g.OrderByDescending(fi => fi.LastWriteTime).First().FullName));
Un altro approccio se si utilizza Directory.EnumerateFiles
e si desidera leggere i file in ultima modifica prima.
foreach (string file in Directory.EnumerateFiles(fileDirectory, fileType).OrderByDescending(f => new FileInfo(f).LastWriteTime)) }
private List GetLastUpdatedFileInDirectory(DirectoryInfo directoryInfo) { FileInfo[] files = directoryInfo.GetFiles(); List lastUpdatedFile = null; DateTime lastUpdate = new DateTime(1, 0, 0); foreach (FileInfo file in files) { if (file.LastAccessTime > lastUpdate) { lastUpdatedFile.Add(file); lastUpdate = file.LastAccessTime; } } return lastUpdatedFile; }
Faccio questo è un sacco di mie app e uso una dichiarazione come questa:
var inputDirectory = new DirectoryInfo("\\Directory_Path_here"); var myFile = inputDirectory.GetFiles().OrderByDescending(f => f.LastWriteTime).First();
Da qui si avrà il nome file per il file salvato / aggiunto / aggiornato più recentemente nella directory della variabile “inputDirectory”. Ora puoi accedervi e fare ciò che vuoi con esso.
Spero possa aiutare.