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

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

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

13 Solutions collect form web for “Сортировка Directory.GetFiles ()”

Если вас интересуют свойства таких файлов, как CreationTime, тогда было бы разумнее использовать System.IO.DirectoryInfo.GetFileSystemInfos (). Затем вы можете отсортировать их с помощью одного из методов расширения в System.Linq, например:

 DirectoryInfo di = new DirectoryInfo("C:\\"); FileSystemInfo[] files = di.GetFileSystemInfos(); var orderedFiles = files.OrderBy(f => f.CreationTime); 

Изменить – извините, я не заметил тег .NET2.0, поэтому игнорирую сортировку LINQ. Однако предложение использовать System.IO.DirectoryInfo.GetFileSystemInfos () сохраняется.

В .NET 2.0 вам нужно будет использовать Array.Sort для сортировки FileSystemInfos.

Кроме того, вы можете использовать делегат Comparer, чтобы избежать объявления classа только для сравнения:

 DirectoryInfo dir = new DirectoryInfo(path); FileSystemInfo[] files = dir.GetFileSystemInfos(); // sort them by creation time Array.Sort(files, delegate(FileSystemInfo a, FileSystemInfo b) { return a.LastWriteTime.CompareTo(b.LastWriteTime); }); 

Вот решение VB.Net, которое я использовал.

Сначала сделайте class для сравнения дат:

 Private Class DateComparer Implements System.Collections.IComparer Public Function Compare(ByVal info1 As Object, ByVal info2 As Object) As Integer Implements System.Collections.IComparer.Compare Dim FileInfo1 As System.IO.FileInfo = DirectCast(info1, System.IO.FileInfo) Dim FileInfo2 As System.IO.FileInfo = DirectCast(info2, System.IO.FileInfo) Dim Date1 As DateTime = FileInfo1.CreationTime Dim Date2 As DateTime = FileInfo2.CreationTime If Date1 > Date2 Then Return 1 If Date1 < Date2 Then Return -1 Return 0 End Function End Class 

Затем используйте сопоставление при сортировке массива:

 Dim DirectoryInfo As New System.IO.DirectoryInfo("C:\") Dim Files() As System.IO.FileInfo = DirectoryInfo.GetFiles() Dim comparer As IComparer = New DateComparer() Array.Sort(Files, comparer) 

 Dim Files() As String Files = System.IO.Directory.GetFiles("C:\") Array.Sort(Files) 

Из msdn :

Порядок имен возвращаемых файлов не гарантируется; используйте метод Sort (), если требуется определенный порядок сортировки.

Метод Sort () является стандартным массивом Array.Sort (), который принимает IComparables (среди других перегрузок), поэтому, если сортировать по дате создания, он будет обрабатывать локализацию на основе параметров машины.

Вы можете реализовать пользовательский iComparer для сортировки. Прочитайте информацию о файле для файлов и сравните, как вам нравится.

 IComparer comparer = new YourCustomComparer(); Array.Sort(System.IO.Directory.GetFiles(), comparer); 

msdn info Интерфейс IComparer

Более сжатая версия VB.Net … очень приятная. Спасибо. Чтобы перемещаться по списку в обратном порядке, добавьте обратный метод …

 For Each fi As IO.FileInfo In filePaths.reverse ' Do whatever you wish here Next 

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

Вы правы, по умолчанию меня зовут asc. Единственный способ, которым я нашел, изменить порядок сортировки, чтобы создать данные из коллекции FileInfo.

Затем вы можете использовать DefaultView из datatable и отсортировать каталог с помощью метода .Sort.

Это довольно привлекательно и довольно медленно, но я надеюсь, что кто-то опубликует лучшее решение.

Вы можете написать пользовательский интерфейс IComparer для сортировки по дате создания, а затем передать его в Array.Sort. Вероятно, вы также захотите посмотреть на StrCmpLogical, что и используется для сортировки Explorer (сортировка чисел корректно с текстом).

Если вы хотите сортировать что-то вроде даты создания, вам, вероятно, нужно будет использовать DirectoryInfo.GetFiles, а затем отсортировать полученный массив с помощью подходящего Predicate.

Просто идея. Мне нравится найти простой выход и попробовать использовать уже имеющиеся ресурсы. если бы я сортировал файлы, я бы просто создал процесс и сделал 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. И это БЫСТРО. Я просто ленивый парень;)

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

 /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 

Более сжатая версия 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 
  • Registry Watcher C #
  • LINQ в .NET 2.0 Runtime
  • Чтение dll.config (не app.config!) Из модуля плагина
  • Могу ли я контролировать расположение пользовательских настроек .NET, чтобы избежать потери настроек при обновлении приложений?
  • Преобразование растровых изображений в один многостраничный TIFF-образ в .NET 2.0
  • Regex только для чисел
  • Как создать простой прокси-сервер в C #?
  • Сравните два списка различий
  • Недопустимый аргумент обратной передачи или обратного вызова. Проверка событий активируется с помощью « '
  • Запуск приложения на основе .net без .NET Framework
  • return return внутри блока using () {} Устанавливает перед выполнением
  • Interesting Posts

    Каковы эквиваленты PowerShell для Bash’s && и || операторы?

    При архивировании на DVD, должен ли я сделать зеркальную копию, подобную RAID 1?

    Rails – использовать тип столбца без STI?

    Как проверить, является ли массив пустым / пустым?

    Где находится сообщение «Вы ответили на это сообщение …», хранящиеся в Outlook?

    Почему комбайнер необходим для метода уменьшения, который преобразует тип в java 8

    Может ли быть потеря данных на жестком диске из-за перераспределенных секторов?

    Асинхронное и синхронное выполнение, что это значит?

    Контакты не отображаются в контактной книге, но они отображаются в поле «Кому». Зачем?

    Не удалось найти com.google.android.gms: play-services: 3.1.59 3.2.25 4.0.30 4.1.32 4.2.40 4.2.42 4.3.23 4.4.52 5.0.77 5.0.89 5.2.08 6.1. 11 6.1.71 6.5.87

    Загрузите внешний CSS-стиль в компонент Angular 2

    Элемент прокрутки в виде с seleniumом

    Что подразумевается под терминами CPU, Core, Die и Package?

    Размер фона с SVG в IE9-10

    Windows 7 32-разрядная полезная отгрузка RAM

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