将文件夹路径的所有目录递归到我的Poco中

时间:2016-04-30 04:25:04

标签: c# recursion directory

我写了一个像这样的poco:

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

然后我写了两个像这样的方法

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

但我不工作任何人都可以将其改为工作方法吗? 我不知道如何填写我的Poco正确。我需要递归方法。

3 个答案:

答案 0 :(得分:0)

您可以使用此代码

而不是递归
Directory.GetDirectories(path, "*", SearchOption.AllDirectories)

答案 1 :(得分:0)

如果您想递归加载目录,那么您不需要GetList方法。方法DirSearch已经足够,但需要进行一些重构,如下所示:

function update(data) {

  // DATA JOIN
  // Join new data with old elements, if any.
  var text = svg.selectAll("text")
      .data(data);

  // UPDATE
  // Update old elements as needed.
  text.attr("class", "update");

  // ENTER
  // Create new elements as needed.
  text.enter().append("text")
      .attr("class", "enter")
      .attr("x", function(d, i) { return i * 32; })
      .attr("dy", ".35em");

  // ENTER + UPDATE
  // Appending to the enter selection expands the update selection to include
  // entering elements; so, operations on the update selection after appending to
  // the enter selection will apply to both entering and updating nodes.
  text.text(function(d) { return d; });

  // EXIT
  // Remove old elements as needed.
  text.exit().remove();
}

请注意我使用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; } 代替Directory.EnumerateDirectories的代码段。我这样做是因为后者不具备表现力。

要调用此方法,请执行以下操作:

Directory.GetDirectories

您可以使用lst = DirSearch(pathToYourDirectory); 代替IEnumerable作为List属性的类型,使其更好。

您的代码最终将如下所示:

MyDirectories

确实,您的静态属性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) }); } 也必须是lst类型。

通过执行这些更改,您将能够开始使用IEnumerable<MyDirectory>的每个实例,而不是在使用MyDirectory时等待返回所有子目录。

答案 2 :(得分:0)

为您的POCO创建cunstructor。

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

递归方法:

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

最后拨打FindRecursiveDirectories方法。

var result = FindRecursiveDirectories(yourDirectory);