0

我正在获取计算机中所有目录和子目录的列表。我正在使用递归。

没关系,直到我执行实际递归

我收到此错误:

System.NullReferenceException: Object reference not set to an instance of an object. 
at tgpwebged.Views.Admin.recursiveFileTree.WalkDirectoryTree(DirectoryInfo root) 
in s:\Projects\tgpwebged\tgpwebged\Views\Admin\recursiveFileTree.cs:line 93

这是课程:

static void WalkDirectoryTree(System.IO.DirectoryInfo root)
    {
        System.IO.DirectoryInfo[] subDirs = null;

        try
        {
            DirectoryInfo[] SubDirs = root.GetDirectories("*.*", SearchOption.TopDirectoryOnly);

            foreach(DirectoryInfo sdir in SubDirs) {
                log.Add(sdir.ToString());
            }

        }
        catch (Exception e)
        {
            log.Add("Exceção: " + e.ToString());
        }

        try
        {
            foreach (System.IO.DirectoryInfo dirInfo in subDirs)
            {
                log.Add(dirInfo.ToString());
                WalkDirectoryTree(dirInfo);
            }
        }
        catch (Exception e)
        {
            log.Add("Exceção: " + e.ToString());
            log.Add("");
        }
     }  

如您所见,最后一个 for each 获取目录中的子目录列表并再次调用该函数执行递归。

此类从逻辑驱动程序接收所有顶级目录并深入到最后一个目录结构。

4

3 回答 3

2

看起来您有两个不同的变量,它们在不同的情况下被命名为相同的事物:

System.IO.DirectoryInfo[] subDirs = null;
DirectoryInfo[] SubDirs = root.GetDirectories("*.*", SearchOption.TopDirectoryOnly);

您正在尝试迭代,subDirs但您从未在任何地方实际设置它。

// subDirs is always null because you never set it to anything other than null
// in the variable declaration
foreach (System.IO.DirectoryInfo dirInfo in subDirs)
{
    log.Add(dirInfo.ToString());
    WalkDirectoryTree(dirInfo);
}
于 2012-12-05T17:21:35.913 回答
2

你不关心System.IO.DirectoryInfo[] subDirs = null;

但是你用DirectoryInfo[] SubDirs

于 2012-12-05T17:21:49.570 回答
2

C# 区分大小写,

SubDirs不是subdirs

您声明两者,同时使用两者,但仅实例化一个。


您的消毒功能(不是类)应该是,

static void WalkDirectoryTree(System.IO.DirectoryInfo root)
{
    foreach(var subDirectory in root.GetDirectories(
        "*.*", 
        SearchOption.AllDirectories))
    {
        log.Add(subDirectory.ToString());
    }
}

log但是,传递给函数是有意义的。

于 2012-12-05T17:21:59.813 回答