【发布时间】:2012-09-17 17:50:53
【问题描述】:
如果您找到更合适的方式来命名此问题的标题,请随时更新。
我有节点
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));
}
}
这将使我能够执行转换,但我缺少分配目录的大小......
【问题讨论】:
-
node.Name,node.FullName我在Node中看不到这些属性 -
修复它。不过这并不重要。我也在初始化构造函数中的其他变量。我感兴趣的唯一变量是目录的大小......
-
为什么不遍历所有子文件来计算总大小..即使在操作系统中,它们也会在您查询文件夹大小时确定文件夹大小。
-
想一想:如果
node.Children在构造函数中为空,那么你会碰到叶子,所以首先设置this.Size = (node.Value is FileInfo) ? ((FileInfo)node.Value).Length : 0,然后使用ScanItem tmp = this; while (tmp.Parent != null) { tmp.Parent.Size += tmp.Size; tmp = tmp.Parent; }“冒泡添加”到根的大小 -
是的,我喜欢这个主意。每次添加新文件时,我都会触发 buble 事件。那里虽然有很多活动。我下降了 10 级(最高 10 级),然后计划向该目录添加 1000 个文件,然后我将执行 1000*10 事件...