Как найти последний файл в каталоге с помощью .NET и без цикла?

Мне нужно найти последний измененный файл в каталоге.

Я знаю, что могу File.GetLastWriteTime каждый файл в папке и сравнивать File.GetLastWriteTime , но есть ли лучший способ сделать это без цикла ?.

как насчет чего-то подобного …

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

Если вы хотите искать рекурсивно, вы можете использовать этот красивый fragment кода:

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

Просто назовите его следующим образом:

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

вот и все. Возвращает экземпляр FileInfo или null если каталог пуст.

Развернув на первом выше, если вы хотите найти определенный шаблон, вы можете использовать следующий код:

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

Версия, отличная от 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; } 

Короткие и простые :

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

это немного поздно, но …

ваш код не будет работать из-за list lastUpdateFile = null; и позже lastUpdatedFile.Add(file); поэтому исключение NullReference будет выбрано. Рабочая версия должна быть:

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

благодаря

Вы можете реагировать на новую активность файла с помощью FileSystemWatcher .

Вот версия, которая получает самый последний файл из каждого подкаталога

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

Другой подход, если вы используете Directory.EnumerateFiles и хотите сначала прочитать файлы с последними изменениями.

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

Я делаю это куча моих приложений, и я использую такой оператор:

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

Здесь у вас будет имя файла для последнего сохраненного / добавленного / обновленного файла в каталоге переменной «inputDirectory». Теперь вы можете получить к нему доступ и делать то, что хотите.

Надеюсь, это поможет.

Давайте будем гением компьютера.