遍历树初始化变量

时间:2012-09-17 17:50:54

标签: c# recursion tree

如果您找到更适合的方式来命名此问题的标题,请随时更新。

我有节点

public Class Node
{
    public List<Node> Children = new List<Node>();
    public Node Parent;
    public FileSystemInfo Value;
}

表示树中的文件。

现在我想更改该节点类:

class ScanItem
{
    public List<ScanItem> Children; 
    public ScanItem Parent;

    public long Size;
    public string Name;    
    public string FullPath;
    public bool IsDirectory;
    // etc....    

}

所以我的问题是我如何才能将Node类对象转换为ScanItem我想存储文件和目录的大小,而不仅仅是文件。(Node类只存储文件的大小而不是目录)因此,我必须以某种方式递归地跟踪子项的大小总和为了达到我想要的目的。

到目前为止,我已将此构造函数放在ScanItem上:

    public ScanItem(Node node)
    {                        
        this.Name = node.Name;
        this.FullPath = node.Value.FullName;

        foreach(var child in node.Children)
        {
             this.Children.add(new ScanItem(child));
        }
    }

这将使我能够执行演员表但我缺少指定目录的大小......

1 个答案:

答案 0 :(得分:1)

要获取目录的大小,您可以使用此扩展方法

public static class DirectoryInfoEx
{
    public static long GetDirectorySize(this DirectoryInfo di)
    {
        long size = 0;

        var fileInfos = di.GetFiles();
        foreach (var fi in fileInfos)
        {
            size += fi.Length;
        }

        var subDirInfos = di.GetDirectories();
        foreach (var subDir in subDirInfos)
        {
            size += GetDirectorySize(subDir);
        }

        return size;
    }
}

如果我正确地得到了这个,你只需要在ScanItem类的构造函数中添加两行代码

public ScanItem(Node node)
{                        
    this.Name = node.Name;
    this.FullPath = node.Value.FullName;
    DirectoryInfo di = new DirectoryInfo(this.FullPath);  //<<<<<<<
    this.Size = di.GetDirectorySize();                    //<<<<<<<

    foreach(var child in node.Children)
    {
         this.Children.add(new ScanItem(child));
    }
}

您可能需要处理UnauthorizedAccessException等特殊情况。您还可以通过删除公共字段来改善您的风格,例如将其转换为公开自动属性 public long Size{get;set;}