ruta obtener nombre mostrar manipular directorios directorio carpeta buscar archivos archivo c# .net file loops last-modified

nombre - obtener ruta de carpeta c#



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

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 ?.


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


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

List<string> reports = new List<string>(); 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));


Hago esto es un montón de mis aplicaciones y uso una declaración 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.



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.


Una versión que no es LINQ:

/// <summary> /// Returns latest writen file from the specified directory. /// If the directory does not exist or doesn''t contain any file, DateTime.MinValue is returned. /// </summary> /// <param name="directoryInfo">Path of the directory that needs to be scanned</param> /// <returns></returns> 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; } /// <summary> /// 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. /// </summary> /// <param name="directoryInfo">Path of the directory that needs to be scanned</param> /// <returns></returns> 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; }


es un poco tarde pero ...

su código no funcionará, debido a la list<FileInfo> 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<FileInfo> GetLastUpdatedFileInDirectory(DirectoryInfo directoryInfo) { FileInfo[] files = directoryInfo.GetFiles(); List<FileInfo> lastUpdatedFile = new List<FileInfo>(); DateTime lastUpdate = DateTime.MinValue; foreach (FileInfo file in files) { if (file.LastAccessTime > lastUpdate) { lastUpdatedFile.Add(file); lastUpdate = file.LastAccessTime; } } return lastUpdatedFile; }

Gracias


Corto y simple :

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


private List<FileInfo> GetLastUpdatedFileInDirectory(DirectoryInfo directoryInfo) { FileInfo[] files = directoryInfo.GetFiles(); List<FileInfo> 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; }