Come trovare il file più recente in una directory utilizzando .NET e senza eseguire il loop?

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 lastUpdateFile = null; 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.