Как я могу написать метод C #, который будет извлекать все каталоги в дереве каталогов, используя String [] и List? - PullRequest
0 голосов
/ 10 мая 2018
 public static List<string[]> SubSubFolders()
    {
       // int variable for while loop
        int i = 0;
        // String Array to hold top SubFol
        string[] dir = Directory.GetDirectories("c:\\");

        //List<String[]> to hold a list of arrays from dir
        List<string[]> subSub = new List<string[]>();

        string[] finalResult = new string[0];

        //Loop through all the folders in the dir.
        while (i < dir.Length)
        {
            string folder1 = dir(i);

            DirectoryInfo di = new DirectoryInfo(folder1);
            if (!di.Attributes.HasFlag(FileAttributes.Hidden))
            {   
                subSub.Add(Directory.GetDirectories(folder1));
            }
            i++;
        }

        return subSub;
    }

Это мой код.Моя цель - создать программу, которая позволит мне просмотреть все каталоги, существующие под данным каталогом, и вывести их в порядке их появления.Так, например, общий код будет делать это:

c:\documents
c:\documents\abtemp
c:\documents\abtemp\chuck
c:\documents\rubbish
c:\documents\state1
etc

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

Что я сделал, чтобы решить эту проблему: * Попробуйте добавить каталог в subSub: я получаю сообщение об ошибке: невозможно преобразовать строку в строку [].* Попробуйте изменить subSub на строку [] вместо списка: я не могу добавить подкаталоги в массив.* Попробуйте изменить dir на List вместо string []: * Directory.GetDirectories выдает ошибку Cannot неявно преобразовать тип 'string []' в 'System.Collections.Generic.List'

Итак, мои вопросы:Как добавить мой каталог в subSub или наоборот, чтобы завершить список?Есть ли более чистый способ сделать эту работу?

1 Ответ

0 голосов
/ 10 мая 2018

Ваш вопрос немного двусмысленный, поэтому я не совсем уверен, с какой проблемой вы хотите помочь, но я думаю, что вижу, чего вы пытаетесь достичь - пробежаться по дереву папок и вывести список всех папок.?

Если это так, то лучший способ сделать это - использовать рекурсивную функцию - вызывать сам вызов функции до тех пор, пока он не достигнет нижней части дерева, добавив его в список следующим образом:

class Program
{
    static void Main(string[] args)
    {
        var list = new List<string>();
        SubSubFolders(@"C:\Program Files\Microsoft Office", list);

        Console.WriteLine(list.Aggregate((s1,s2)=>s1+Environment.NewLine+s2));
        Console.WriteLine("Press enter...");
        Console.ReadLine();
    }


    public static void SubSubFolders(string basePath, List<string> folders)
    {
        //if (folders.Count > 500) return;
        string[] dirs = new string[] { };
        try
        {
            dirs = Directory.GetDirectories(basePath);
        }
        catch(Exception exc)
        {
            // Handle access failures - there will be folders you can't enumerate unless running as admin
        }

        for (int i = 0; i < dirs.Length; i++)
        {
            folders.Add(dirs[i]);
            SubSubFolders(dirs[i], folders);
        }
    }
}

Обратите внимание, что это займет много времени, если вы попытаетесь перечислить все каталоги на среднем компьютере - скажем, из c: \.Для этого вам понадобится серьезная оптимизация и, возможно, вам потребуется перейти на язык более низкого уровня, если вы хотите действительно хорошую производительность.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...