Ordenando Directory.GetFiles ()

System.IO.Directory.GetFiles() devuelve una string[] . ¿Cuál es el orden de clasificación predeterminado para los valores devueltos? Asumo por su nombre, pero si es así, ¿cuánto lo afecta la cultura actual? ¿Puedes cambiarlo a algo así como la fecha de creación?

Actualización: MSDN señala que el orden de clasificación no está garantizado para .Net 3.5, pero la versión 2.0 de la página no dice nada en absoluto y ninguna de las páginas le ayudará a ordenar por cosas como la creación o la hora de modificación. Esa información se pierde una vez que tiene la matriz (contiene solo cadenas). Podría construir un comparador que compruebe cada archivo que obtiene, pero eso significa acceder al sistema de archivos repetidamente cuando presumiblemente el método .GetFiles () ya lo hace. Parece muy ineficiente.

Si está interesado en las propiedades de los archivos como CreationTime, entonces tendría más sentido usar System.IO.DirectoryInfo.GetFileSystemInfos (). Puede ordenarlos usando uno de los métodos de extensión en System.Linq, por ejemplo:

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

Editar: lo siento, no me di cuenta de la etiqueta .NET2.0, así que ignore la clasificación LINQ. La sugerencia de utilizar System.IO.DirectoryInfo.GetFileSystemInfos () aún se mantiene.

En .NET 2.0, deberá usar Array.Sort para ordenar FileSystemInfos.

Además, puede usar un delegado de Comparer para evitar tener que declarar una clase solo para la comparación:

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

Aquí está la solución VB.Net que he usado.

Primero haga una clase para comparar fechas:

 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 

Luego use el comparador mientras ordena la matriz:

 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) 

Desde msdn :

El orden de los nombres de archivos devueltos no está garantizado; use el método Sort () si se requiere un orden de clasificación específico.

El método Sort () es el estándar Array.Sort (), que admite IComparables (entre otras sobrecargas), por lo que si ordena por fecha de creación, manejará la localización según la configuración de la máquina.

Puede implementar iComparer personalizado para hacer la clasificación. Lea la información del archivo de los archivos y compárelo como desee.

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

msdn info Interfaz IComparer

Una versión VB.Net más sucinta … es muy agradable. Gracias. Para recorrer la lista en orden inverso, agregue el método inverso …

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

La documentación de MSDN establece que no hay garantía de ningún pedido en los valores de devolución. Tienes que usar el método Sort ().

Estás en lo correcto, el valor predeterminado es mi nombre asc. La única forma que he encontrado para cambiar el orden de clasificación es crear una tabla de datos de la colección FileInfo.

A continuación, puede usar DefaultView de la tabla de datos y ordenar el directorio con el método .Sort.

Esto es bastante complicado y bastante lento, pero espero que alguien publique una mejor solución.

Puede escribir una interfaz IComparer personalizada para ordenar por fecha de creación y luego pasarla a Array.Sort. Probablemente también quiera ver StrCmpLogical, que es lo que se usa para hacer la clasificación que usa Explorer (ordenando los números correctamente con el texto).

Si desea ordenar por fecha de creación, probablemente necesite utilizar DirectoryInfo.GetFiles y luego ordenar la matriz resultante utilizando un predicado adecuado.

Solo una idea. Me gusta encontrar una salida fácil y tratar de reutilizar los recursos ya disponibles. si tuviera que ordenar archivos, solo habría creado un proceso y haría syscal a “DIR [x: \ Folders \ SubFolders *. *] / s / b / on” y capturaría el resultado.

Con el comando DIR del sistema puede ordenar por:

 /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 

NO ESTOY SEGURO SI D = Por fecha / hora usa LastModifiedDate o FileCreateDate. Pero si el orden de clasificación necesario ya está incorporado en el comando DIR, lo obtendré llamando a syscall. Y es RÁPIDO. Solo soy el chico perezoso;)

Después de un poco de búsqueda en Google encontré el interruptor para ordenar por fecha / hora en particular: –

 /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 

Una versión VB.Net más sucinta, si alguien está interesado

 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