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

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

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

64
задан casperOne 23 August 2012 в 17:39
поделиться

11 ответов

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

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

Редактирование - извините, я не заметил тег.NET2.0, так проигнорируйте сортировку LINQ. Предложение для использования Системы. IO.DirectoryInfo. GetFileSystemInfos () все еще содержит все же.

109
ответ дан Tim Schmelter 24 November 2019 в 15:43
поделиться

В.NET 2.0, необходимо будет использовать Массив. Вид к виду FileSystemInfos.

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

DirectoryInfo dir = new DirectoryInfo(path);
FileSystemInfo[] files = dir.GetFileSystemInfos();

// sort them by creation time
Array.Sort<FileSystemInfo>(files, delegate(FileSystemInfo a, FileSystemInfo b)
                                    {
                                        return a.LastWriteTime.CompareTo(b.LastWriteTime);
                                    });
13
ответ дан Chris Karcher 24 November 2019 в 15:43
поделиться

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

Первый делают класс для сравнения дат:

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)
12
ответ дан AlfonsoML 24 November 2019 в 15:43
поделиться

Dim Files() As String
Files = System.IO.Directory.GetFiles("C:\")
Array.Sort(Files)
7
ответ дан SysDragon 24 November 2019 в 15:43
поделиться

От msdn:

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

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

6
ответ дан Guy Starbuck 24 November 2019 в 15:43
поделиться

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

Вы можете, тогда использовал DefaultView из таблицы данных, и отсортируйте каталог с.Sort методом.

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

3
ответ дан GateKiller 24 November 2019 в 15:43
поделиться

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

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

интерфейс IComparer информации о MSDN

3
ответ дан Vertigo 24 November 2019 в 15:43
поделиться

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

2
ответ дан Vaibhav 24 November 2019 в 15:43
поделиться

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

2
ответ дан Tina Marie 24 November 2019 в 15:43
поделиться

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

2
ответ дан samjudson 24 November 2019 в 15:43
поделиться

Просто идея. Мне нравится находить простой выход и пытаться повторно использовать уже имеющиеся ресурсы. Если бы я должен был сортировать файлы, я бы просто создал процесс и сделал 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 = By Date/Time 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
1
ответ дан 24 November 2019 в 15:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: