2012-09-17 79 views
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)); 
     } 
    } 

這將使我來執行轉換,但我缺少指定目錄的大小...

+0

'node.Name,node.FullName'我無法在'Node'中看到這些屬性, – user1655481

+0

修復它。這並不重要。我正在初始化構造函數中的其他變量。我感興趣的唯一變量是大小,當涉及到目錄... –

+0

爲什麼不遍歷所有的子文件來計算總大小..即使在操作系統,他們確定文件夾大小的時候你查詢其大小。 – user1655481

回答

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 C的構造lass

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

+0

+1感謝您的幫助。這有效,但我會兩次找到這些文件,從而使算法慢兩倍。我忘了提及我運行一個遞歸方法來查找所有文件和目錄,並返回一個Node對象及其相應的子對象。 –

+0

如果你做了兩次 - 緩存它。基本緩存將是一個帶有您選擇的id和將被重用的值的字典。你放鬆了一些記憶,但獲得了性能。 – oleksii