1

I wrote a poco like this :

public class MyDirectory
{
    public string Path { get; set; }
    public List<MyDirectory> MyDirectories { get; set; }
}

then I wrote 2 methods like this

    private static List<MyDirectory> lst = new List<MyDirectory>();
    private static void DirSearch(string dir)
    {
            var dirs = Directory.GetDirectories(dir);

            foreach (string d in dirs)
            {
                var ddd = new MyDirectory();
                ddd.Path = d;
                ddd.MyDirectories = GetList(Directory.GetDirectories(d));
                lst.Add(ddd);
                DirSearch(d);
            }            
    }

    private static List<MyDirectory> GetList(string[] list)
    {
        var lst = new List<MyDirectory>();
        foreach (var l in list)
        {
            lst.Add(new MyDirectory() { Path = l });
        }
        return lst;
    }

but I does not work Can anybody change it to working method ? I dont know How fill my Poco correctly. I need recursively method.

Tal Avissar
  • 10,088
  • 6
  • 45
  • 70
HamedFathi
  • 3,667
  • 5
  • 32
  • 72

3 Answers3

0

Instead of do recursive, you can use this code

Directory.GetDirectories(path, "*", SearchOption.AllDirectories)
Mahdi Farhani
  • 964
  • 1
  • 9
  • 22
0

If you want to recursively load directories then you don't GetList method. The method DirSearch is sufficient but need some refactoring like below:

private static List<MyDirectory> DirSearch(string directory)
{
    var directories = new List<MyDirectory>();
    foreach (var l in Directory.EnumerateDirectories(directory))
    {
        directories.Add(new MyDirectory
        {
            Path = l,
            MyDirectories = DirSearch(l)
        });
    }
    return directories;
}

Notice in the snippet I'm using Directory.EnumerateDirectories instead of Directory.GetDirectories. I do this because the latter isn't performant.

To call this method just do this:

lst = DirSearch(pathToYourDirectory);

You can make it better by using IEnumerable instead of List as type of MyDirectories property.

Your code will finally look like this :

public class MyDirectory
{
    public string Path { get; set; }
    public IEnumerable<MyDirectory> MyDirectories { get; set; }
}

private static IEnumerable<MyDirectory> DirSearch(string directory)
{
    return Directory.EnumerateDirectories(directory).Select(l => new MyDirectory
    {
        Path = l,
        MyDirectories = DirSearch(l)
    });
}

Indeed your static property lst need to be of type IEnumerable<MyDirectory> also.

By doing those changes you will be able to start using each instance of MyDirectory instead of waiting all subdirectories to be returned when using List.

CodeNotFound
  • 22,153
  • 10
  • 68
  • 69
0

Create cunstructor for your POCO.

public class MyDirectory
    {
        public MyDirectory()
        {
            MyDirectories = new List<MyDirectory>();
        }
        public string Path { get; set; }
        public List<MyDirectory> MyDirectories { get; set; }
    }

Recursive Method:

private MyDirectory FindRecursiveDirectories(string dir)
    {
        var rootDirectory = new MyDirectory();
        rootDirectory.Path = dir;

        foreach (var subDirectory in Directory.EnumerateDirectories(dir))
        {
            var myDir = FindRecursiveDirectories(subDirectory);
            rootDirectory.MyDirectories.Add(myDir);
        }

        return rootDirectory;
    }

Finally call FindRecursiveDirectories Method.

var result = FindRecursiveDirectories(yourDirectory);
Mazaher Bazari
  • 421
  • 5
  • 12