41 votes

Triage du résultat de Directory.GetFiles en C#

J'ai ce code pour lister tous les fichiers dans un répertoire.

class GetTypesProfiler
{
    static List Test()
    {
        List dataList = new List();
        string folder = @"DIRECTORY";
        Console.Write("------------------------------------------\n");
        var files = Directory.GetFiles(folder, "*.dll");
        Stopwatch sw;
        foreach (var file in files)
        {   
            string fileName = Path.GetFileName(file);
            var fileinfo = new FileInfo(file);
            long fileSize = fileinfo.Length;
            Console.WriteLine("{0}/{1}", fileName, fileSize);
        }
        return dataList;
    }
    static void Main()
    {
         ...
    }
}

J'ai besoin d'imprimer les informations des fichiers en fonction de leur taille ou de l'ordre alphabétique. Comment puis-je trier le résultat de Directory.GetFiles() ?

81voto

Jon Points 194296

Très facile avec LINQ.

Pour trier par nom,

var trié = Directory.GetFiles(".").OrderBy(f => f);

Pour trier par taille,

var trié = Directory.GetFiles(".").OrderBy(f => new FileInfo(f).Length);

15voto

Dyppl Points 4731

Pour commander par date: (renvoie un énumérable de FileInfo):

Directory.GetFiles(folder, "*.dll").Select(fn => new FileInfo(fn)).
                                    OrderBy(f => f.Length);

ou, pour commander par nom:

Directory.GetFiles(folder, "*.dll").Select(fn => new FileInfo(fn)).
                                    OrderBy(f => f.Name);

Créer des instances FileInfo n'est pas nécessaire pour commander par nom de fichier, mais si vous voulez appliquer différentes méthodes de tri sur le vif, il vaut mieux avoir votre tableau d'objets FileInfo en place et ensuite simplement les trier avec OrderBy par la propriété Length ou Name, d'où cette implémentation. De plus, il semble que vous allez quand même créer des FileInfo, il est donc préférable d'avoir une collection d'objets FileInfo dans tous les cas.

Désolé, je ne l'ai pas fait correctement la première fois, j'aurais dû lire la question et la documentation plus attentivement.

5voto

Paul Points 8943

Vous pouvez utiliser LINQ si vous le souhaitez, sur un objet FileInfo:

var orderedFiles =  Directory.GetFiles("").Select(f=> new FileInfo(f)).OrderBy(f=> f.CreationTime)

0voto

guuds.com Points 26

Essaie ceci, ça marche pour moi

[System.Runtime.InteropServices.DllImport("Shlwapi.dll", CharSet = System.Runtime.InteropServices.CharSet.Unicode)]
private static extern int StrCmpLogicalW(string psz1, string psz2);
DirectoryInfo di = new DirectoryInfo(path);
FileInfo[] arrFi = di.GetFiles("*.*");
Array.Sort(arrFi, delegate(FileInfo x, FileInfo y) { return StrCmpLogicalW(x.Name, y.Name); });

0voto

Goku Points 129

Cela fonctionne si vous avez seulement besoin de trier par nom de fichier et que le titre du fichier supporte l'ordre logique croissant ou descendant. J'ajoute des variables pour avoir un peu plus de contrôle sur la source et le motif de recherche.

Utilisation de Dir = System.IO;

string Source = votreVariable;
string SearchPattern = votreVariable;

Dir.Directory.GetFiles(Source, SearchPattern, Dir.SearchOption.AllDirectories).OrderBy(s => s).ToList();

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