2012-01-09 19 views
2

我想比較模板文件夾與子文件夾與現有的目錄結構。我試圖遞歸遍歷每個目錄中的所有子文件夾。我的代碼如下。比較兩個文件夾 - 模板與實際

public void compareDirectories(DirectoryInfo Templatedir, DirectoryInfo Projectdir) 
{ 
    DirectoryInfo[] recursiveTemplatedirs = Templatedir.GetDirectories("*.*"); 
    DirectoryInfo[] recursiveProjectdirs = Projectdir.GetDirectories("*.*"); 

    string recursiveName; 
    string projectName; 

    foreach (DirectoryInfo recursiveTemplatedir in recursiveTemplatedirs) 
    { 
     recursiveName = recursiveTemplatedir.Name.ToString(); 
     foreach (DirectoryInfo recursiveProjectdir in recursiveProjectdirs) 
     { 
      projectName = recursiveProjectdir.Name.ToString(); 
      if (recursiveName == projectName) 
      { 
       lstTest.Items.Add("Match " + recursiveName); 
      } 
      else lstTest.Items.Add("No Match " + recursiveName); 
     } 

     compareDirectories(recursiveTemplatedir, recursiveProjectdir); 
    } 
} 

當我嘗試運行這個時,我得到recursiveProjectdir在這種情況下不存在的錯誤。任何想法如何讓這個運行?

+0

單步執行代碼。兩個參數都傳遞給'compasreDirectories'不爲null嗎? – 2012-01-09 13:37:59

+1

recursiveProjectdir只在第二個foreach範圍內有效。 – ken2k 2012-01-09 13:38:51

+0

你不能運行這個,你被困在編譯這個。 – thekip 2012-01-09 13:39:51

回答

3

你得到的錯誤,因爲recursiveProjectdir範圍內只有foreach loop

foreach (DirectoryInfo recursiveTemplatedir in recursiveTemplatedirs) 
    { 
     recursiveName = recursiveTemplatedir.Name.ToString(); 
     foreach (DirectoryInfo recursiveProjectdir in recursiveProjectdirs) 
     { 
     } 
     //recursiveProjectdir doesn't exists outside the foreach loop 
     compareDirectories(recursiveTemplatedir, recursiveProjectdir); 
    } 
+0

有沒有一種方法可以將foreach循環中的recursiveProjectdir傳遞出去。最終,我試圖比較兩個位置的目錄,然後使用模板目錄中設置的ACL權限更改現有目錄的ACL權限。 – 2012-01-09 14:42:24

+0

'recursiveProjectdir'在foreach循環中。您想在外部foreach中使用哪個'recursiveProjectdir'實例?你可以簡單地在foreach之外聲明一個變量,並在foreach中賦值。通過這種方式,你可以在foreach之外使用'recursiveProjectdir' – 2012-01-09 15:27:32

0

移動foreach循環中的最後一個compareDirectories。剛剛修改了測試方法。

public static void compareDirectories(DirectoryInfo Templatedir, DirectoryInfo Projectdir) 
{ 
    DirectoryInfo[] recursiveTemplatedirs = Templatedir.GetDirectories("*.*"); 
    DirectoryInfo[] recursiveProjectdirs = Projectdir.GetDirectories("*.*"); 

    string recursiveName; 
    string projectName; 

    foreach (DirectoryInfo recursiveTemplatedir in recursiveTemplatedirs) 
    { 
     recursiveName = recursiveTemplatedir.Name.ToString(); 
     foreach (DirectoryInfo recursiveProjectdir in recursiveProjectdirs) 
     { 
      projectName = recursiveProjectdir.Name.ToString(); 
      if (recursiveName == projectName) { 
       Console.WriteLine("Match " + recursiveName); 
      } else 
       Console.WriteLine("No Match " + recursiveName); 

     compareDirectories(recursiveTemplatedir, recursiveProjectdir); 
     } 

    } 
}