Как отсортировать файлы/папки, полученные из GetFiles/GetDirectories, по размеру

Я использую GetFiles и GetDirectories для извлечения файлов из диалогового окна браузера папок. Теперь у меня проблема с сортировкой файлов/каталогов по размеру. Я попробовал следующий метод, но не уверен, что будет следующим шагом, чтобы зациклить оба файла/папки в зависимости от их размера.

private void Button1_Click(object sender, EventArgs e)
        {
            //open folder dialog
            FolderBrowserDialog FBD = new FolderBrowserDialog();

            if (FBD.ShowDialog() == DialogResult.OK)
            {
                listBox1.Items.Clear();
                //get file name and file info 
                FileInfo[] files = new DirectoryInfo(FBD.SelectedPath).GetFiles();
                //get directory 
                DirectoryInfo[] dirs = new DirectoryInfo(FBD.SelectedPath).GetDirectories();

                //Order by size.
                var sort = from fileName in files
                            orderby new FileInfo(fileName).Length ascending
                            select fileName; 
                //now I have no idea how to apply this sort to the loop below

                foreach (FileInfo file in files)
                {
                    //print single file output eg. filename (300000 bytes)
                    listBox1.Items.Add(file.Name + "(" + file.Length + " bytes)");
                }

                foreach (DirectoryInfo dir in dirs)
                {
                    //print sub folder output eg. foldername (sum of all childfiles sizes) -> (600000 bytes)
                    listBox1.Items.Add(dir.Name + "(" + dir.GetFiles().Sum(f => f.Length) + " bytes)");
                }
            }
        }

Кнопка откроет диалоговое окно папки и список для отображения результата.


person Alois    schedule 12.09.2019    source источник
comment
Я не уверен, что понимаю, что вы имеете в виду, вы уже отсортировали по размеру в переменной sort, почему вы хотите сделать это снова в цикле, и обратите внимание, что вы используете старый files в foreach, а не sort, который является результатом сортировки.   -  person hessam hedieh    schedule 12.09.2019


Ответы (1)


Для файлов вы можете выполнить одно из следующих действий:

foreach (FileInfo file in sort)

(поскольку вы уже создали OrderedEnumerable заранее)

or

foreach (FileInfo file in files.OrderBy(file => file.Length))

Сортировка каталогов по размеру будет более сложной, так как DirectoryInfo не имеет свойства Length.

Основываясь на ответе Кева здесь, вы можете попробовать:

foreach (DirectoryInfo dir in dirs.OrderBy(dir => dir.EnumerateFiles("*.*", SearchOption.AllDirectories).Sum(fi => fi.Length))
person Kei    schedule 12.09.2019