Я ищу метод, который возьмет тип и каталог расширения файлов и вернет все файлы в этом каталоге и подкаталогах, упорядоченных по последней дате создания, то есть последним файлам.
До сих пор я определил следующий метод, который должен быть быстрым, но есть лучший способ сделать это, и мне нужно, чтобы он возвращал FileInfo, а не строку и упорядочивался, как описано выше.
public static IEnumerable<string> GetFileList(string fileSearchPattern, string rootFolderPath)
{
Queue<string> pending = new Queue<string>();
pending.Enqueue(rootFolderPath);
string[] tmp;
while (pending.Count > 0)
{
rootFolderPath = pending.Dequeue();
tmp = Directory.GetFiles(rootFolderPath, fileSearchPattern);
for (int i = 0; i < tmp.Length; i++)
{
yield return tmp[i];
}
tmp = Directory.GetDirectories(rootFolderPath);
for (int i = 0; i < tmp.Length; i++)
{
pending.Enqueue(tmp[i]);
}
}
}
Когда я исследовал это проблемное пространство, я обнаружил, что это не fast
способ сделать это. Причина в том, какой бы подход вы ни выбрали, вам нужно перейти в операционную систему для списка файлов в каталоге. И файловая система не кэширует/не индексирует способ поиска. Таким образом, вам в конечном итоге нужно пересканировать файловую систему самостоятельно.
Однако, если у вас есть необработанная информация, вы можете индексировать ее самостоятельно.
Ниже будет работать для ваших целей. Вы хотите использовать Directory.EnumerateFiles(...), чтобы список файлов мог использовать меньше памяти спереди. Он будет искать следующий элемент, только когда вы попросите его, а не загрузите всю коллекцию в память в начале.
Directory.EnumerateFiles(rootFolderPath, fileSearchPattern, System.IO.SearchOption.AllDirectories).OrderBy(file => new FileInfo(file).CreationTime)
Еще одно соображение. Поскольку вы делаете довольно слепой поиск через файловую систему, если вы попытаетесь перечислить файл и выбрано исключение, это приведет к недействительности перечислителя, что приведет к его завершению без завершения. Я опубликовал решение этой проблемы здесь
Directory.GetFiles имеет возможность поиска рекурсивно.
Следующее должно работать, хотя я этого не пробовал.
IEnumerable<FileInfo> GetFileList(string directory, string extension)
{
return Directory.GetFiles(directory, "*" + extension, SearchOption.AllDirectories)
.Select(f => new FileInfo(f))
.OrderByDescending(f => f.CreationTime);
}