Вопрос

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

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

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

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);
                                    });

Вот решение 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)

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

От msdn:

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

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

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

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

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

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

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

информация msdn об интерфейсе IComparer

Более лаконичный VB.Чистый version...is очень приятный.Спасибо.Чтобы просмотреть список в обратном порядке, добавьте обратный метод...

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

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

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

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

Просто идея.Мне нравится находить простой выход и пытаться повторно использовать уже имеющиеся ресурсы.если бы мне нужно было сортировать файлы, я бы просто создал процесс и сделал 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

Более лаконичный VB.Сетевая версия, если кому-то интересно

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top