简体   繁体   中英

Get All Directories of a Folder Path Recursively into my Poco

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.

您可以使用此代码,而不是递归

Directory.GetDirectories(path, "*", SearchOption.AllDirectories)

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 .

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);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM