Нет, лучшего способа избежать петли нет. Даже использование LINQ просто скрывает зацикливание в некоторой более глубокой функциональности, где вы не можете видеть это непосредственно.
Оливер
1
Если вы хотите найти самые последние измененные файлы во всей файловой системе, тогда журнал изменений NTFS будет полезен. Очень, очень трудно использовать из C #, хотя.
Бен Фойгт
Ответы:
318
как насчет чего-то вроде этого ...
var directory =newDirectoryInfo("C:\\MyDirectory");var myFile =(from f in directory.GetFiles()orderby f.LastWriteTimedescendingselect f).First();// or...var myFile = directory.GetFiles().OrderByDescending(f => f.LastWriteTime).First();
Лично я считаю, что несахаренную версию легче читать:directory.GetFiles().OrderByDescending(f => f.LastWriteTime).First()
Йорн Шоу-Роде
6
да, я тоже согласен большую часть времени - но когда приводим примеры, синтаксис запроса делает его более очевидным, что это запрос linq. Я уточню пример с обоими вариантами, чтобы уточнить.
Скотт Айви
3
Спасибо! Теперь мне просто нужно убедить моего босса ускорить процесс обновления нас с .net 2.0, чтобы я мог использовать Linq :)
Крис Клепейс,
3
Вы можете использовать linq с 2.0 SP1 с небольшой дополнительной работой - просто обратитесь к файлу System.Core.dll из 3.5 и установите для него значение «копировать локально»
Скотт Айви,
8
Разве это не должно использовать FirstOrDefault()вместо First()? Последний вызовет, InvalidOperationExceptionесли каталог пуст.
Тобиас Дж
20
Если вы хотите выполнять рекурсивный поиск, вы можете использовать этот прекрасный фрагмент кода:
/// <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>privatestaticDateTimeGetLatestWriteTimeFromFileInDirectory(DirectoryInfo directoryInfo){if(directoryInfo ==null||!directoryInfo.Exists)returnDateTime.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>privatestaticFileInfoGetLatestWritenFileFileInDirectory(DirectoryInfo directoryInfo){if(directoryInfo ==null||!directoryInfo.Exists)returnnull;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;}
ваш код не будет работать, потому что list<FileInfo> lastUpdateFile = null;
и позже, lastUpdatedFile.Add(file);так что будет выдано исключение NullReference. Рабочая версия должна быть:
Я делаю это несколько моих приложений, и я использую заявление как это:
var inputDirectory =newDirectoryInfo("\\Directory_Path_here");var myFile = inputDirectory.GetFiles().OrderByDescending(f => f.LastWriteTime).First();
Отсюда у вас будет имя последнего сохраненного / добавленного / обновленного файла в каталоге с переменной inputDirectory. Теперь вы можете получить к нему доступ и делать с ним все, что хотите.
В дополнение к этому, если ваша цель - вернуть путь к файлу, и вы используете FirstOrDefault, поскольку, возможно, результатов нет, вы можете использовать оператор null-conditional в свойстве FullName. Это вернет вам «null» для вашего пути без необходимости сохранять FileInfo из FirstOrDefault перед вызовом FullName. string path = new DirectoryInfo (path) .GetFiles (). OrderByDescending (o => o.LastWriteTime) .FirstOrDefault () ?. FullName;
Ответы:
как насчет чего-то вроде этого ...
источник
directory.GetFiles().OrderByDescending(f => f.LastWriteTime).First()
FirstOrDefault()
вместоFirst()
? Последний вызовет,InvalidOperationException
если каталог пуст.Если вы хотите выполнять рекурсивный поиск, вы можете использовать этот прекрасный фрагмент кода:
Просто назовите это следующим образом:
и это все. Возвращает
FileInfo
экземпляр или,null
если каталог пуст.источник
Развернув первый вариант выше, если вы хотите выполнить поиск определенного шаблона, вы можете использовать следующий код:
источник
Версия без LINQ:
источник
Коротко и просто :
источник
уже немного поздно, но ...
ваш код не будет работать, потому что
list<FileInfo> lastUpdateFile = null;
и позже,lastUpdatedFile.Add(file);
так что будет выдано исключение NullReference. Рабочая версия должна быть:Спасибо
источник
Вы можете реагировать на новые действия с файлами с помощью FileSystemWatcher .
источник
Другой подход, если вы используете
Directory.EnumerateFiles
и хотите читать файлы в последних модифицированных в первую очередь.источник
Вот версия, которая получает самый последний файл из каждого подкаталога
источник
источник
Я делаю это несколько моих приложений, и я использую заявление как это:
Отсюда у вас будет имя последнего сохраненного / добавленного / обновленного файла в каталоге с переменной inputDirectory. Теперь вы можете получить к нему доступ и делать с ним все, что хотите.
Надеюсь, это поможет.
источник