65 votes

Triage Directory.GetFiles()

System.IO.Directory.GetFiles() renvoie un string[] . Quel est l'ordre de tri par défaut des valeurs retournées ? Je suppose par nom, mais si c'est le cas, dans quelle mesure la culture actuelle l'affecte-t-elle ? Pouvez-vous le changer en quelque chose comme la date de création ?

Mise à jour : MSDN signale que l'ordre de tri n'est pas garanti pour .Net 3.5, mais la version 2.0 de la page ne dit rien du tout et aucune des deux pages ne vous aidera à trier par des choses comme l'heure de création ou de modification. Cette 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 vérifierait chaque fichier qu'il reçoit, mais cela signifie accéder au système de fichiers de façon répétée alors que la méthode .GetFiles() le fait probablement déjà. Cela semble très inefficace.

109voto

Ian Nelson Points 20020

Si vous êtes intéressé par les propriétés des fichiers telles que CreationTime, il serait plus judicieux d'utiliser System.IO.DirectoryInfo.GetFileSystemInfos(). Vous pouvez ensuite les trier en utilisant l'une des méthodes d'extension de System.Linq, par exemple :

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

Modification - désolé, je n'ai pas remarqué la balise .NET2.0, donc ignorez le tri LINQ. La suggestion d'utiliser System.IO.DirectoryInfo.GetFileSystemInfos() est toujours valable.

13voto

Chris Karcher Points 1449

Dans .NET 2.0, vous devrez utiliser Array.Sort pour trier les FileSystemInfos.

En outre, vous pouvez utiliser un délégué Comparer pour éviter de devoir déclarer une classe uniquement 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);
                                    });

12voto

sebastiaan Points 2910

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

Faites d'abord une classe pour comparer les 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

Ensuite, utilisez le comparateur 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)

7voto

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

6voto

Guy Starbuck Points 14241

En msdn :

L'ordre des noms de fichiers retournés n'est pas garanti ; utilisez la méthode Sort() si un ordre de tri spécifique est requis.

En Trier() est la méthode standard Array.Sort(), qui prend en compte les IComparables (entre autres surcharges). Ainsi, si vous triez par date de création, la localisation sera gérée en fonction des paramètres de la machine.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X