3

如果您发现命名此问题标题的更合适的方式,请随时更新它。

我有节点

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. 我想存储文件和目录的大小而不仅仅是文件。(节点类只存储文件的大小而不是目录)因此,我将不得不以某种方式递归地跟踪子项大小的总和,以实现我想要的。

到目前为止,我已将此构造函数放在 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));
        }
    }

这将使我能够执行演员,但我缺少分配目录的大小......

4

1 回答 1

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

于 2012-09-17T18:24:43.200 回答