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これが正しければ、クラスのコンストラクターに 2 行のコードを追加するだけです。

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 に答える