目录列表递归

本文关键字:递归 列表 | 更新日期: 2023-09-27 18:15:39

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

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

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

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

我注释掉的部分是引起问题的部分。

如果您能给予任何帮助,我将不胜感激!

目录列表递归

您使用的是。net 4吗?在这种情况下:

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

而不是:

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