Question

System.IO.Directory.GetFiles() retourne un string[].Qu'est-ce que l'ordre de tri par défaut pour les valeurs renvoyées?Je suis en supposant que par son nom, mais si oui, combien la culture actuelle effet il?Pouvez-vous changer pour quelque chose comme la date de création?

Mise à jour: MSDN souligne que l'ordre de tri n'est pas garanti .Net 3.5, mais la version 2.0 de la page ne veut rien dire du tout, et ni page vous aidera à trier par des choses comme la création ou de la modification du temps.L'information est perdue une fois que vous avez le tableau (il ne contient que des chaînes de caractères).Je pourrais construire un comparateur, qui permettrait de contrôler pour chaque fichier qu'il obtient, mais cela signifie que l'accès au système de fichiers à plusieurs reprises lors de probablement la .GetFiles() la méthode déjà fait cela.Semble très inefficace.

Était-ce utile?

La solution

Si vous êtes intéressés par les propriétés des fichiers tels que des CreationTime, alors il serait plus judicieux d'utiliser le Système.IO.DirectoryInfo.GetFileSystemInfos().Vous pouvez ensuite trier à l'aide de l'une des méthodes d'extension dans le Système.Linq, par exemple:

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

Edit - désolé, je n'ai pas remarqué de la .NET2.0 balise donc ignorer le LINQ tri.La suggestion d'utiliser le Système.IO.DirectoryInfo.GetFileSystemInfos() détient toujours bien.

Autres conseils

Dans .NET 2.0, vous aurez besoin d'utiliser un Tableau.Trier pour trier les FileSystemInfos.

En outre, vous pouvez utiliser un Comparateur de délégué pour éviter d'avoir à déclarer une classe juste pour la comparaison:

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

Voici l'VB.Net la solution que j'ai utilisé.

D'abord faire une catégorie à comparer des dates:

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

Utilisez ensuite les comparer tout en triant le tableau:

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)

À partir de msdn:

L'ordre de retour de noms de fichier n'est pas garanti;utiliser la méthode sort() si un ordre de tri spécifique est nécessaire.

L' Sort() la méthode est la gamme standard.Sort(), qui prend en IComparables (entre autres surcharges), donc si vous triez par date de création, elle prendra en charge la localisation basée sur les paramètres de la machine.

Vous avez raison, la valeur par défaut est mon nom asc.Le seul moyen que j'ai trouvé pour changer l'ordre de tri pour créer une table de la FileInfo collection.

Vous pouvez ensuite utilisé la DefaultView de la datatable et trier le répertoire avec le .Méthode de tri.

C'est tout à fait participer et assez lent, mais je suis en espérant que quelqu'un poste la meilleure solution.

Vous pouvez implémenter des iComparer à faire le tri.Lire les informations du fichier pour les fichiers et les comparer comme vous le souhaitez.

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

msdn info interface IComparer

Un plus succincte VB.Net version...est très agréable.Je vous remercie.La traversée de la liste dans l'ordre inverse, ajouter la méthode inverse...

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

L' La Documentation MSDN déclare qu'il n'existe aucune garantie de quelque ordre sur les valeurs de retour.Vous devez utiliser la méthode sort ().

Vous pourriez écrire un personnalisé interface IComparer pour trier par date de création, et de le passer à la Matrice.De tri.Vous avez sans doute aussi envie de regarder StrCmpLogical, qui est ce qui est utilisé pour faire le tri Explorer utilise (tri correctement les numéros avec le texte).

Si vous souhaitez trier par quelque chose comme la date de création, vous aurez probablement besoin d'utiliser DirectoryInfo.GetFiles et puis trier le tableau résultant à l'aide d'une Prédicat.

Juste une idée.J'aimerais trouver un moyen facile et essayez de ré utiliser les ressources déjà disponibles.si je devais trier les fichiers je viens de créer un processus et faire syscal à "DIR [x:\Folders\SubFolders*.*] /s /b /sur la" et la capture de la sortie.

Avec le système de commande DIR, vous pouvez trier les résultats par :

/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

Je ne SUIS PAS SÛR SI D = Date/Heure est à l'aide de LastModifiedDate ou FileCreateDate.Mais si le besoin l'ordre de tri est déjà intégré dans la commande DIR, je vais obtenir que par l'appel de syscall.Et c'est RAPIDE.Je suis juste le gars paresseux ;)

Après un peu de recherche sur google, j'ai trouvé l'interrupteur pour trier par date/heure:-

/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

Un plus succincte VB.Net version, si quelqu'un est intéressé

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top