2013-06-12 44 views
0

所以我有一個存放一堆配置文件的目錄,但是現在我也有幾個也包含配置文件的子目錄。我有一個收集每個站點所有配置文件的功能,但現在它只收集目錄中的文件,而不是子文件夾。舊代碼:快速和骯髒的方式遞歸收集子目錄中的文件?

string MasterList = "ConfigsForStation1.txt"; 
    string dirC = "..\\config\\Station1\\"; 
    foreach (FileInfo fileC in dirC.GetFiles()) 
      { 
       if(!System.IO.Path.GetExtension(fileC.FullName).EndsWith(".confg")) 
       {  WriteToList(fileC,MasterList);} 

    } 

現在有了這個子目錄的東西來實現它沿着以上的這些行:

 string MasterList = ...; 
     string dirC = ...; 
     //collect files in sub directories substations 1 & 2 
     foreach(DirectoryInfo Dx in dirC.GetDirectories()) 
     { foreach(FileInfo fileC in Dx.GetFiles()) 
      {...} 
     } 
     //collect files in parent directory station 1 
     foreach(FileInfo fileC in dirC.GetFiles()) 
     {...} 

我的問題是:是否有從所有子文件夾收集文件而不是巢更清潔的方式一個foreach裏的foreach?然後在父母身上進行第三次傳遞。它感覺不錯,我覺得像dirC.getAllsub()這樣的命令會對我這樣做嗎?只是尋找提示和想法來清理代碼。

+0

您已經使用了術語'recursive',但是您沒有實現真正的遞歸方法。 – DonBoitnott

回答

1

GetFiles()方法將返回他們都在一個鏡頭:

String dirC = "..\\config\\Station1\\"; 
DirectoryInfo di = new DirectoryInfo(dirC); 
FileInfo[] fia = di.GetFiles("*.*", SearchOption.AllDirectories); 
foreach (FileInfo fi in fia) 
{ 
    //do something with the file 
} 

,可隨時更換搜索模式*.*與任何適合你正在尋找的文件如*.cfg

2

Directory.EnumerateFiles()你可以傳遞參數SearchOption.AllDirectories,你可以用它來告訴它自動爲你遞歸文件。

你應該能夠做這樣的事情:

foreach (string filename in Directory.EnumerateFiles(dirC, "*.confg", SearchOption.AllDirectories)) 
    ... Do something with filename 

或者,如果你需要在每個文件處理:

foreach (string filename in Directory.EnumerateFiles(dirC, "*", SearchOption.AllDirectories)) 
    ... Do something with filename 
1

使用Directory.GetFiles()SearchOption.AllDirectories。這會自動爲你遞減。

1

我想寫這個評論,但stackoverflow不讓我。

退房this question它提供了許多方法來做你想問什麼。

1

使用Directory.GetFiles:

var files = Directory.GetFiles("C:\\", "*", SearchOption.AllDirectories); 
相關問題