Сортировка результата Directory.GetFiles в C # - PullRequest
30 голосов
/ 09 июня 2011

У меня есть этот код, чтобы перечислить все файлы в каталоге.

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()
    {
         ...
    }
}

Мне нужно распечатать информацию о файле в зависимости от размера файла или в алфавитном порядке.Как я могу отсортировать результат из Directory.GetFiles ()?

Ответы [ 4 ]

61 голосов
/ 09 июня 2011

Очень просто с LINQ.

Сортировать по имени,

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

Сортировать по размеру

var sorted = Directory.GetFiles(".").OrderBy(f => new FileInfo(f).Length);
9 голосов
/ 09 июня 2011

Упорядочить по дате: (возвращает перечисление FileInfo):

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

или, по заказу по имени:

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

Создание FileInfo экземпляров не обязательно для упорядочивания по имени файла, но если вы хотите применять различные методы сортировки на лету, лучше иметь массив из FileInfo объектов на месте, а затем просто OrderBy их Length или Name свойство, следовательно, эта реализация. Кроме того, похоже, что вы все равно создадите FileInfo, поэтому лучше иметь коллекцию объектов FileInfo в любом случае.

Извините, я не понял правильно с первого раза, мне следовало бы более внимательно прочитать вопрос и документы.

5 голосов
/ 09 июня 2011

Вы можете использовать LINQ, если хотите, для объекта FileInfo:

var orderedFiles =  Directory.GetFiles("").Select(f=> new FileInfo(f)).OrderBy(f=> f.CreationTime)
0 голосов
/ 13 мая 2019

попробуй это, у меня работает

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