用c#和递归写一个树状结构到磁盘

本文关键字:一个 结构 磁盘 递归 | 更新日期: 2023-09-27 18:08:58

我对C#相当陌生,我正在尝试从列表中创建树结构,并将其写入文件系统。(我已经用过这个答案了)。

也就是说,我想在适当的深度创建目录和子目录。然而,我被深度卡住了,想不出如何循环遍历深度的每次迭代,然后返回开始再次写入,而不是只写所有0深度的目录,然后所有1深度的目录,等等,在同一个位置。

我在想还有一个递归的routine/method/function,但是我就是想不起来。我希望我对编程的理解能更上一层楼。

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

用c#和递归写一个树状结构到磁盘

因为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的更多调用,这可能会对性能产生影响。