Сортировка Directory.GetFiles () - PullRequest
       35

Сортировка Directory.GetFiles ()

64 голосов
/ 10 сентября 2008

System.IO.Directory.GetFiles() возвращает string[]. Каков порядок сортировки по умолчанию для возвращаемых значений? Я предполагаю по имени, но если да, то насколько это влияет нынешняя культура? Можете ли вы изменить его на что-то вроде даты создания?

Обновление: MSDN указывает, что порядок сортировки не гарантирован для .Net 3.5, но версия страницы 2.0 вообще ничего не говорит, и ни одна страница не поможет вам сортировать по таким вещам, как время создания или модификации. Эта информация теряется, когда у вас есть массив (он содержит только строки). Я мог бы создать компаратор, который проверял бы каждый файл, который он получал, но это означало бы повторный доступ к файловой системе, когда, по-видимому, метод .GetFiles () уже делает это. Кажется очень неэффективным.

Ответы [ 13 ]

2 голосов
/ 10 сентября 2008

Документация MSDN гласит, что нет гарантии какого-либо заказа на возвращаемые значения. Вы должны использовать метод Sort ().

1 голос
/ 21 марта 2013

Более краткая версия VB.Net, если кому-то интересно

Dim filePaths As Linq.IOrderedEnumerable(Of IO.FileInfo) = _
  New DirectoryInfo("c:\temp").GetFiles() _
   .OrderBy(Function(f As FileInfo) f.CreationTime)
For Each fi As IO.FileInfo In filePaths
  ' Do whatever you wish here
Next
1 голос
/ 31 марта 2010

Просто идея. Мне нравится находить легкий выход и пытаться повторно использовать уже имеющиеся ресурсы. если бы я сортировал файлы, я бы просто создал процесс и сделал syscal для «DIR [x: \ Folders \ SubFolders *. *] / s / b / on» и захватил бы вывод.

С помощью системной команды DIR вы можете сортировать по:

/O          List by files in sorted order.
sortorder    N  By name (alphabetic)       S  By size (smallest first)
             E  By extension (alphabetic)  D  By date/time (oldest first)
             G  Group directories first    -  Prefix to reverse order

The /S switch includes sub folders

Я НЕ УВЕРЕН, ЕСЛИ D = По дате / времени использует LastModifiedDate или FileCreateDate. Но если необходимый порядок сортировки уже встроен в команду DIR, я получу это, вызвав syscall. И это БЫСТРО. Я просто ленивый парень;)

После небольшого поиска я нашел переключатель для сортировки по определенной дате / времени: -

/t [[:]TimeField] : Specifies which time field to display or use for sorting. The following list describes each of the values you can use for TimeField. 

Value Description 
c : Creation
a : Last access
w : Last written
...