我正在获取计算机中所有目录和子目录的列表。 我正在使用递归。
直到我执行实际递归
我收到此错误:
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("");
}
}
如您所见,每个的最后一个获取dir中的subdir列表并再次调用该函数执行递归。
此类从逻辑驱动程序接收所有顶级目录,并深入到最后一个目录结构。
答案 0 :(得分: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);
}
答案 1 :(得分:2)
您声明System.IO.DirectoryInfo[] subDirs = null;
但您使用DirectoryInfo[] SubDirs
答案 2 :(得分:2)
C#区分大小写,
SubDirs
不是subdirs
你声明两者,使用两者但只实例化一个。
您已清理的功能(不是类)应该是,
static void WalkDirectoryTree(System.IO.DirectoryInfo root)
{
foreach(var subDirectory in root.GetDirectories(
"*.*",
SearchOption.AllDirectories))
{
log.Add(subDirectory.ToString());
}
}
但是,将log
传递给函数是有意义的。