web-dev-qa-db-fra.com

Tri 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<Data> Test()
    {
        List<Data> dataList = new List<Data>();
        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 sur le fichier en fonction de la taille du fichier ou de l'ordre alphabétique. Comment puis-je trier le résultat de Directory.GetFiles ()?

32
prosseek

Très facile avec LINQ.

Pour trier par nom,

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

Pour trier par taille,

var sorted = Directory.GetFiles(".").OrderBy(f => new FileInfo(f).Length);
62
Jon

Pour classer par date: (retourne 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);

Il n'est pas nécessaire de créer des instances de FileInfo pour les classer par nom de fichier, mais si vous souhaitez appliquer différentes méthodes de tri à la volée, il est préférable d'avoir votre tableau d'objets FileInfo en place, puis simplement OrderBy par la propriété Length ou Name, d'où cette implémentation. De plus, il semble que vous allez créer FileInfo de toute façon, il est donc préférable d'avoir une collection d'objets FileInfo dans les deux cas.

Désolé de ne pas avoir bien compris la première fois, j'aurais dû lire la question et les documents plus attentivement.

9
Dyppl

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)
5
Paul

essayez ça, ç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); });
0
guuds.com