gpt4 book ai didi

c# - 遍历树初始化变量

转载 作者:行者123 更新时间:2023-11-30 17:58:16 26 4
gpt4 key购买 nike

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

我有节点

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

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

最佳答案

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

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)字段来改进您的样式,例如将它们转换为公共(public)自动属性 public long Size{get;set;}.

关于c# - 遍历树初始化变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12464621/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com