Сортирует ли DirectoryInfo.EnumerateDirectories элементы? - PullRequest
1 голос
/ 16 марта 2012

У меня есть приложение, которое должно перечислить несколько папок и обработать файлы внутри них.

Он должен поддерживать возобновление, то есть запускаться из папки, которую он обрабатывал в последний раз.

Я думал об использовании метода DirectoryInfo.EnumerateDirectories . Я сохранял бы имя последнего обработанного dir в файле, пропускал перечисление, пока не встретил это имя dir, и продолжил бы обработку оттуда.

Однако в документации ничего не говорится о порядке, в котором перечислены файлы.

Можно ли предположить, что при использовании этого метода программа всегда будет обрабатывать оставшиеся каталоги? Или возможно, что в следующий раз, когда программа запустится, каталоги будут перечислены в другом порядке, что позволит оставить некоторые необработанные и обработать другие два раза?

Если этот метод небезопасен, что может быть хорошей альтернативой?

Ответы [ 2 ]

2 голосов
/ 06 мая 2016

Внутренне EnumerateDirectories () использует Win32 API FindNextFile () ( исходный код ).От MSDN:

"Порядок, в котором поиск возвращает файлы, например, в алфавитном порядке, не гарантируется и зависит от файловой системы."

1 голос
/ 16 марта 2012

DirectoryInfo.EnumerateDirectories () возвращает IEnumerable<DirectoryInfo> в вашем документе MSDN.Я не думаю, что он уже отсортирован, и даже если он отсортирован, есть вопрос о том, по какому полю или свойству DirectoryInfo.Вы можете сделать сортировку самостоятельно по запросу.

// Create a DirectoryInfo of the Program Files directory.
DirectoryInfo dirPrograms = new DirectoryInfo(@"c:\program files");

DateTime StartOf2009 = new DateTime(2009, 01, 01);
// LINQ query for all directories created before 2009.
var dirs = (from dir in dirPrograms.EnumerateDirectories()
                where dir.CreationTimeUtc < StartOf2009
                order by dir.Name).ToList();
...