Reputation: 105
I'm getting a problem when trying to concatenate a List to another one in a recursive method. I can print out each member of the List each time it recurses, but as soon as I try and add it to another master List it seems to have problems.
The error I'm getting is: Null Object Reference error.
My main motivation to do this is to recursively create a listing of all directories and subdirectories in a given folder/path.
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;
}
}
}
The part I commented out is the bit causing the problems.
Any help you could give would be greatly appreciated!
Upvotes: 3
Views: 810
Reputation: 225095
Instead of:
allSubDirectories.Add(sDir);
It should be:
subDirs.Add(sDir);
You just used the wrong variable name. allSubDirectories
is class-level and isn't instantiated when getAllSubdirectories
is called.
A better solution for recursion, sometimes (especially when you're using Concat
as an alternative) is a 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;
}
Upvotes: 3
Reputation: 5492
Are you using .NET 4? In which case:
System.IO.Directory.GetDirectories(@"C:\My Sample Path\","*",
System.IO.SearchOption.AllDirectories);
Upvotes: 4