2015-06-15 2 views
0

Я пытаюсь перечислить все папки моего диска c, исключая папку документа, к которой у меня, похоже, нет доступа. Сначала это показалось мне довольно простым, но я все еще борется с ним, несмотря на, казалось бы, богатую библиотеку .net.Список каталогов по размеру содержимого с помощью C#

Я не могу опубликовать какой-либо код, поскольку то, что я пробовал до сих пор, на самом деле не работает.

Надеюсь, что-то предложит что-то.

+0

«Я все еще борется с ним» Возможно, вы могли бы, inimum, опишите, с чем вы боретесь. Похоже, это могут быть разрешения, но это было бы предположение. На данный момент этот вопрос читается как запрос учебника, который не соответствует теме SO. – spender

+0

начинайте с корневого каталога, итерации по папкам/файлам, размер проверки. сохранить в списке или словарь. используйте ваше сердце. Невозможно ничего показать, если вы пробовали звуки скорее .... подозрительно ... – Noctis

+0

У меня есть административное право на моем ноутбуке. причина, по которой я исключаю папку с документами, связана с тем, что я получаю «отказ в доступе к ошибке» –

ответ

1

Небольшой пример здесь:

class DirectorySize 
{ 
    public string DirectoryName; 
    public long DirectorySizes; 
} 

public class Program 
{ 
    static void Main(string[] args) 
    { 
     string[] cDirectories = Directory.GetDirectories("C:\\"); 

     List<DirectorySize> listSizes = new List<DirectorySize>(); 

     for (int i = 0; i < cDirectories.Length; i++) 
     { 
      long size = GetDirectorySize(cDirectories[i]); 

      if(size != -1) 
      { 
       listSizes.Add(new DirectorySize() { DirectoryName = cDirectories[i], DirectorySizes = size }); 
      } 
     } 
    } 

    private static long GetDirectorySize(string folderPath) 
    { 
     try 
     { 
      DirectoryInfo di = new DirectoryInfo(folderPath); 
      return di.EnumerateFiles("*", SearchOption.AllDirectories).Sum(fi => fi.Length); 
     } 
     catch 
     { 
      // If you get Access denied error handle it here 
      return -1; 
     } 
    } 
} 
+0

Я получаю «Доступ к пути» C: \ Documents and Settings 'is denied. " –

+0

Я изменил ваш код следующим образом: .return di.EnumerateFiles ("*", SearchOption.AllDirectories) .Where (c => c.DirectoryName.Contains ("Documents and Settings") == false) .Sum (fi => fi.Length); все то же исключение –

+0

@MeelfanBmfp Да. Он не перечислит ни один пользователь по умолчанию, это просто исправление совместимости для старых приложений, которые жестко закодировали пути профиля пользователя. Вы заметите, что вы * можете * перечислить 'C: \ Documents and Settings \% username%'. – Phylogenesis

0

Другой способ сделать это, чтобы реализовать метод расширения LINQ (бессовестно украдены у верхней ответ на this question:

public static class Extensions 
{ 
    public static IEnumerable<T> SkipExceptions<T>(this IEnumerable<T> values) 
    { 
     using (var enumerator = values.GetEnumerator()) 
     { 
      bool next = true; 
      while (next) 
      { 
       try 
       { 
        next = enumerator.MoveNext(); 
       } 
       catch 
       { 
        continue; 
       } 

       if (next) yield return enumerator.Current; 
      } 
     } 
    } 
} 

Затем вы можете запустить перечислитель следующим образом:

DirectoryInfo di = new DirectoryInfo(@"C:\"); 
var size = 
    di.EnumerateFiles("*", SearchOption.AllDirectories) 
    .SkipExceptions() 
    .Sum(fi => fi.Length); 
+0

Скорее умный способ сделать это. Можно ли это изменить, чтобы включить подпапки? –

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