2016-02-25 4 views
-2

Я хочу группировать папки в зависимости от их имен. Я не хочу переместить их в отдельные папки или изменить что-либо в каталоге. Просто для более чистого отображения я хочу сгруппировать их в две папки. Имена папок как альфа и числовые.Групповые папки по именам в алфавитном или цифровом

В настоящее время мой код извлекает все имена папок и их размер вместе с общим размером. Поэтому функциональность остается тем же, но вместо того, чтобы перечислить все папки, я хочу, чтобы сгруппировать то и показать что-то вроде this-

Total size: xx.xx MB 
Name: Alpa 
Size: xx.xx MB 
Name: Numb 
Size: xx.xx MB 

Я был бы признателен за ваши предложения о внесении этого кода более лучше.

Ниже приведен код, который я использую.

static void Main(string[] args) 
{ 
    DirectoryInfo dir = new DirectoryInfo(@"D\temp"); 

    long sizeOnDisk = DiskSize(dir, true); 
    Console.WriteLine("Total Size: " + "{0:N2} MB", ((double)sizeOnDisk)/(1024 * 1024)); 


    foreach (DirectoryInfo folder in dir.EnumerateDirectories()) 
    { 
     long sizeOfFolder = DiskSize(folder, true); 

     Console.WriteLine("Name: " + "{0}", folder.Name); 
     Console.WriteLine("Size: " + "{0:N2} MB", ((double)sizeOfFolder)/(1024 * 1024)); 

    } 
     Console.ReadLine(); 
} 

static long DiskSize(DirectoryInfo dir, bool includeSubDir) 
{ 

    long totalSize = dir.EnumerateFiles() 
       .Sum(file => file.Length); 


    if (includeSubDir) 
    { 

     totalSize += dir.EnumerateDirectories() 
       .Sum(dirt => DiskSize(dirt, true)); 
    } 
    return totalSize; 
} 
+0

Вы действительно не задали вопрос здесь. –

+0

Я, может быть, мой способ спросить не был прав. В принципе, мне нужен совет о том, как сделать код лучше, лучше всего. –

+0

Вопросы «Лучшая практика» являются оффтопическими для stackoverflow. –

ответ

-1

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

string firstChar = "1"; //or whatever the first character of your folder name is 
      int num; 
      if (Int32.TryParse(firstChar,num)) 
       NumbFolderSize += dir.Size; 
      else 
       AlpaFolderSize += dir.Size; 
+0

Спасибо! Да, я применил аналогичную логику и отделил папки –

+0

Рад, что вы это поняли! Кажется, люди склонны к downvoting на этом сайте. – Seano666

0

Предполагая, что (так как вы не спрашивали напрямую), которые вы хотите, чтобы группировать папки, имена которых на самом деле число против тех, с нечисловыми именами, вы можете использовать GroupBy операцию с соответствующим методом генерирования ключа, чтобы сделать так.

Простой тест для числового имени файла заключается в использовании одного из методов TryParse. На всякий случай, если у вас очень большие числа, я бы использовал long.TryParse, чтобы выяснить, является ли это число. Таким образом, вы можете создавать свои группы, как это:

DirectoryInfo dir = new DirectoryInfo(@"D:\Temp"); 
long v; 
var folderGroups = dir.EnumerateDirectories().GroupBy(d => 
    long.TryParse(d.Name, out v) ? "Number" : "Alpha" 
); 

Это даст вам множество DirectoryInfo записей, сгруппированных по String ключа. Теперь вам просто нужно получить размеры. Вместо рекурсивного метода, который ходит по дереву папок, вы можете получить полный список всех файлов в дереве в одном вызове, обобщать результаты и производить последовательность можно перечислить через так:

var groupSizes = folderGroups 
    .OrderBy(grp => grp.Key) 
    .Select(grp => 
     new { 
      Name = grp.Key, 
      Size = grp.Sum(d => 
       // this is the bit that gets all of the files 
       d.EnumerateFiles("*", SearchOption.AllDirectories) 
        .Sum(f => f.Length)) 
     } 
    ) 
    .ToArray(); 

Мы можем Подводя выше, чтобы получить в общей сложности затем добавить его в качестве отдельной записи, давая вам массив результатов, которые вы можете выход в одном цикле:

var results = new[] { new { Name = "Total", Size = groupSizes.Sum(grp => grp.Size) } } 
    .Concat(groupSizes); 

foreach (var row in results) 
{ 
    Console.WriteLine("Name: {0}", row.Name); 
    Console.WriteLine("Size: {0:#,0.00} MB", row.Size/1048576d); 
} 

что на мой тест производит:

Name: Total 
Size: 795.09 MB 
Name: Alpha 
Size: 137.46 MB 
Name: Number 
Size: 657.63 MB 

достаточно близко?

+0

Спасибо за ваш ответ, я бы попробовал это. Вы объяснили это хорошо. Я новичок, поэтому мне иногда трудно понять, что применять где и как. Хотя у меня есть понятия. –

+0

Я, как правило, использую LINQ намного больше, чем раньше, в основном, чтобы уйти от работы с промежуточными списками и т. Д. Возможность группировать и сортировать с помощью одного вызова метода имеет тенденцию упрощать многие вещи, и как только вы привыкнете к чтению, запросы LINQ могут значительно упростить понимание того, что делает код ... до тех пор, пока вы понимать отложенное исполнение. – Corey

+0

Я пытался запустить этот код, но по какой-то причине я получаю только верхний результат. Имя: Всего –

Смежные вопросы