¿Cómo encontrar el archivo más reciente en un directorio usando .NET y sin bucle?

Necesito encontrar el archivo modificado más recientemente en un directorio.

Sé que puedo recorrer todos los archivos de una carpeta y comparar File.GetLastWriteTime , pero ¿hay una mejor manera de hacerlo sin bucles ?.

Qué tal algo como esto…

 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(); 

Si desea buscar recursivamente, puede usar esta hermosa pieza de código:

 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(); } 

Solo llámalo de la siguiente manera:

 FileInfo newestFile = GetNewestFile(new DirectoryInfo(@"C:\directory\")); 

y eso es. Devuelve una instancia de FileInfo o null si el directorio está vacío.

Ampliando el primero, si desea buscar un patrón determinado, puede usar el siguiente código:

 string pattern = "*.txt" var dirInfo = new DirectoryInfo(directory); var file = (from f in dirInfo.GetFiles(pattern) orderby f.LastWriteTime descending select f).First(); 

Una versión que no es 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; } 

Corto y simple :

 new DirectoryInfo(path).GetFiles().OrderByDescending(o => o.LastWriteTime).FirstOrDefault(); 

es un poco tarde pero …

su código no funcionará, debido a la list lastUpdateFile = null; y luego lastUpdatedFile.Add(file); por lo tanto, se lanzará una excepción de NullReference. La versión de trabajo debe ser:

 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; } 

Gracias

Puede reactjsr a la nueva actividad de archivos con FileSystemWatcher .

Aquí hay una versión que obtiene el archivo más reciente de cada subdirectorio

 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)); 

Otro enfoque si está usando Directory.EnumerateFiles y quiere leer archivos en la última modificación por primera vez.

 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; } 

Hago esto es un montón de mis aplicaciones y uso una statement como esta:

  var inputDirectory = new DirectoryInfo("\\Directory_Path_here"); var myFile = inputDirectory.GetFiles().OrderByDescending(f => f.LastWriteTime).First(); 

A partir de aquí, tendrá el nombre de archivo del último archivo guardado / agregado / actualizado en el Directorio de la variable “inputDirectory”. Ahora puedes acceder a él y hacer lo que quieras con él.

Espero que ayude.