使用C#和递归将树结构写入磁盘

时间:2015-08-21 03:11:11

标签: c# recursion tree

我对C#相当新,我试图采用我从列表中创建的树结构,并将其写入文件系统。 (我已使用此answer)。

也就是说,我想以适当的深度创建目录和子目录。然而,我陷入了深度困境,无法想到如何循环深度的每次迭代,然后退出再次开始写入,而不是只编写所有0深度目录,然后是所有1深度目录等等,在同一地点。

我认为还有另一个递归routine/method/function,但我无法绕过它。在我对编程的理解中,我想进入下一个级别(ha)。

static void Test(IEnumerable<TreeItem<category>> categories, int deep = 0)
{
    foreach (var c in categories)
    {
        for (int i = 0; i < deep; ++i) {
            System.IO.Directory.CreateDirectory(c.Item.Name); 
    }
        Test(c.Children, deep + 1);
    }
}

1 个答案:

答案 0 :(得分:3)

因为Directory.CreateDirectory为您创建了所有父目录,假设您已为每个节点存储了完整路径,您只需要将叶节点(没有子节点的节点)传递给它。

您可以编写递归搜索来检索叶节点,然后将该列表传递给CreateDirectory

static IEnumerable<TreeItem<category>> GetLeafs(IEnumerable<TreeItem<category>> tree) 
{
    foreach (var item in tree)
    {
        if (item.Children.Any()) 
        {
            // this is not a leaf, so find the leaves in its descendants
            foreach (var leaf in GetLeafs(item.Children))
                yield return leaf;                
        }
        else
        {
            // no children, so this is a leaf
            yield item;                
        }
    }
}

static void CreateDirectories(IEnumerable<TreeItem<category>> categories)
{
    foreach (var leaf in GetLeafs(categories)) 
    {
        System.IO.Directory.CreateDirectory(leaf.Item.Name);
    }
}

如果您没有针对每个节点的完整路径,那么您可以使用与GetLeafs相同的结构(虽然结果更简单,因为您不需要返回任何内容备份调用链)以递归方式遍历树,在深入时创建目录:

static void CreateDirectories(IEnumerable<TreeItem<category>> tree) 
{
    foreach (var item in tree)
    {
        Directory.Create(c.Item.Name);        
        CreateDirectories(item.Children);                        
    }
}

此方法更简单,但会导致对Directory.Create的更多调用,这可能会对性能产生影响。