Каталог списков рекурсии - PullRequest
3 голосов
/ 24 ноября 2011

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

Я получаю следующую ошибку: Null Object Referenceошибка.

Моя основная мотивация для этого - рекурсивно создать список всех каталогов и подкаталогов в заданной папке / пути.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;


namespace listsubdirsinfile
{
    class Program
    {
        public static DirectoryInfo directory;
        public static List<DirectoryInfo> allSubDirectories;
        public static FileInfo[] files;

        static void Main(string[] args)
        {
            directory = new DirectoryInfo(@"C:\cs\");

            allSubDirectories = getAllSubdirectories(directory);


            Console.WriteLine("allSubdirectories\n-----------------");
            foreach (DirectoryInfo aDirectory in allSubDirectories)
            {
                Console.WriteLine(aDirectory.ToString());
            }
            Console.ReadKey();
        }

        static List<DirectoryInfo> getAllSubdirectories(DirectoryInfo dir)
        {
            List<DirectoryInfo> subDirs = new List<DirectoryInfo>();

            subDirs = dir.GetDirectories().ToList();
            foreach (DirectoryInfo sDir in subDirs)
            {
                Console.WriteLine(sDir.ToString());

               // allSubDirectories.Add(sDir);

                subDirs.Concat(getAllSubdirectories(sDir));
            }

            return subDirs;
        }
    }
}

Часть, которую я прокомментировал, - это бит, вызывающий проблемы,

Любая помощь, которую вы можете оказать, будет принята с благодарностью!

Ответы [ 2 ]

4 голосов
/ 24 ноября 2011

Вы используете .NET 4? В каком случае:

System.IO.Directory.GetDirectories(@"C:\My Sample Path\","*",
    System.IO.SearchOption.AllDirectories);
3 голосов
/ 24 ноября 2011

Вместо:

allSubDirectories.Add(sDir);

Это должно быть:

subDirs.Add(sDir);

Вы просто использовали неверное имя переменной.allSubDirectories на уровне класса и не создается при вызове getAllSubdirectories.


РЕДАКТИРОВАТЬ:

Иногда лучшее решение для рекурсии (особенно при использованииConcat в качестве альтернативы) является Stack<T>:

    static List<DirectoryInfo> getAllSubdirectories(DirectoryInfo dir)
    {
        List<DirectoryInfo> subDirs = new List<DirectoryInfo>();
        Stack<DirectoryInfo> toProcess = new Stack<DirectoryInfo>();
        toProcess.Push(dir);

        while(toProcess.Count > 0) {
            subDirs.AddRange(toProcess.Pop().GetDirectories());
        }

        return subDirs;
    }
...