AKTStudios
AKTStudios

Reputation: 105

Directory listings recursion

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

Answers (2)

Ry-
Ry-

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.


EDIT:

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

Alastair Maw
Alastair Maw

Reputation: 5492

Are you using .NET 4? In which case:

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

Upvotes: 4

Related Questions