2010-10-06 121 views
6

我有一個函數,當前抓取所有文件夾和子文件夾來檢查ACL的一個小工具,我正在建設,但我拉我的頭髮試圖找出如何限制它可以去的深度。例如,你有一個文件夾深度達到4級,但我希望只能抓取ACL的3個級別。如何限制遞歸子目錄搜索的深度

目前我有它正是如此編碼:

private void StepThroughDirectories(string dir) 
{ 
    string[] directories = Directory.GetDirectories(dir); 
    try 
    { 
     foreach (string d in Directory.GetDirectories(dir)) 
     { 
      if (recCount < (int)Depth) 
      { 
       GetACLs(d, new DirectoryInfo(d)); 
       pBar.Value += 1; 
       //MessageBox.Show("Recursive Level: " + counter.ToString()); 
       recCount++; 
       StepThroughDirectories(d); 
      } 
      else 
      { 
       recCount--; 
      } 
     } 
    } 
    catch (System.Exception e) 
    { 
     Console.WriteLine(e.Message); 
    } 
} 

顯然,這並不像你一樣,那是因爲我一直對這個問題的一小會兒,但如果任何人都可以點我在正確的方向解決這個問題我會很開心!

+0

什麼不適合你的工作是什麼嗎?看起來像這樣的代碼不會編譯 - 宣佈recCount的位置(以及pBar和Depth)?和你的(註釋掉)MessageBox.Show使用計數器來代替.... – 2010-10-06 16:06:22

回答

18

首先,避免外界宣佈recCount字段作爲「全局」變量。在遞歸場景中,通過遞歸調用傳遞狀態通常更易於管理。

其次,將深度測試移出foreach以刪除不必要的查詢文件系統的子目錄。

第三,將實際的處理邏輯放在方法的開始處,再放到子目錄處理循環之外。然後

你的代碼是這樣:

void StepThroughDirectories(string dir) 
{ 
    StepThroughDirectories(dir, 0) 
} 

void StepThroughDirectories(string dir, int currentDepth) 
{ 
    // process 'dir' 
    ... 

    // process subdirectories 
    if (currentDepth < MaximumDepth) 
    { 
     foreach (string subdir in Directory.GetDirectories(dir)) 
      StepThroughDirectories(subdir, currentDepth + 1); 
    } 
} 
+0

你剛剛救了我一個下午的頭痛!謝謝! – 2010-10-06 16:33:39

+0

很高興聽到,我很高興我的解決方案幫助你。 – 2010-10-06 16:34:37

+3

而不是傳遞currentDepth,我的正常偏好是傳遞depthLimit,它將倒數而不是倒數。 – supercat 2010-10-06 17:52:10

5

一種可能的方法是,在方法外添加一個類字段,並在變量中添加一個變量以指示深度最多可達的最大值。

int levels;

private void StepThroughDirectories(string dir, int depth) 
{ 
    levels ++; 
    if (levels > depth) 
     return; 
    string[] directories = Directory.GetDirectories(dir); 
    try 
    { ... 
+0

實際上,'levels'不代表深度,而是'StepThroughDirectories'調用的數量。 – digEmAll 2010-10-06 16:15:00

+1

這一點的缺點是您不能同時對StepThroughDirectories進行兩次調用(因爲可以共享級別)。也許在這個應用中不是一個問題,但是Ondrej Tucny的解決方案更加獨立清潔。 – 2010-10-06 16:17:53

+0

@Paul好點。我在回答時沒有考慮到這一點。 – jac 2010-10-07 04:21:12

2

遞減RECCOUNT當你從StepThroughDirectories返回,但這將是更好的... ...

private void StepThroughDirectories(string dir, int depth) 
    { 
     if (depth < 0) 
      return; 
     string[] directories = Directory.GetDirectories(dir); 
     try 
     { 
      foreach (string d in Directory.GetDirectories(dir)) 
      { 
       // your code here 
       Console.WriteLine("{0}", d); 
       StepThroughDirectories(d, depth-1); 
      } 
     } 
     catch (System.Exception e) 
     { 
      Console.WriteLine(e.Message); 
     } 
    } 
+0

嗯,是的,這是我一開始沒有注意到的錯誤的根源。不過,這個設計有點笨拙,所以一些重構使其更具可讀性和可管理性,這也是建議。 – 2010-10-06 16:13:07

+0

編輯我的帖子,添加我建議的重構 – Les 2010-10-06 16:20:46

+0

迄今爲止發佈的所有建議似乎都認爲,將狀態遞歸遞歸是一種推薦做法,更好的內聚性,減少耦合(對全局變量)。 – Les 2010-10-06 16:26:22