目录列表递归

时间:2011-11-24 01:09:23

标签: c# object recursion reference null

我尝试在递归方法中将List连接到另一个时遇到问题。每次递送时我都可以打印出List的每个成员,但是一旦我尝试将它添加到另一个主列表中,它似乎就会出现问题。

我得到的错误是:空对象引用错误。

我这样做的主要动机是以递归方式创建给定文件夹/路径中所有目录和子目录的列表。

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 个答案:

答案 0 :(得分:4)

您使用的是.NET 4吗?在这种情况下:

System.IO.Directory.GetDirectories(@"C:\My Sample Path\","*",
    System.IO.SearchOption.AllDirectories);

答案 1 :(得分:3)

而不是:

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;
    }