2011-07-07 80 views
14

這裏是我的代碼:如何執行完整的遞歸目錄和文件掃描?

private static void TreeScan(string sDir) 
    { 
     foreach (string d in Directory.GetDirectories(sDir)) 
     { 
      foreach (string f in Directory.GetFiles(d)) 
      { 
       //Save file f 
      } 
     } 
     TreeScan(d, client); 
    } 

的問題是,它沒有得到SDIR的FILES(啓動Directory)它只是變得在子文件夾的文件夾和文件。

我怎樣才能讓它從sDir獲取文件呢?

回答

8
private static void TreeScan(string sDir) 
{ 
    foreach (string f in Directory.GetFiles(sDir)) 
    { 
     //Save f :) 
    } 
    foreach (string d in Directory.GetDirectories(sDir)) 
    { 
     TreeScan(d); 
    } 
} 
1

你必須使用

Directory.GetFiles(targetDirectory); 

This sample,至極包含你正在尋找

44

什麼,否則不要重新發明輪子,使用過載的完整實現GetFiles,它允許您指定它搜索子目錄。

string[] files 
    = Directory.GetFiles(path, searchPattern, SearchOption.AllDirectories); 
+2

終於有人有一些道理。 –

+1

是的,但遞歸失敗的第一個保護與文件夾System.UnauthorizedAccessException。 – MuiBienCarlota

+0

如果您不需要搜索模式,則可以使用星號(*)作爲搜索模式以返回所有目錄 –

2

您的代碼存在一些問題。首先,你從來沒有看到根文件夾中的文件的原因是因爲你在做和讀文件之前遞歸。試試這個:

public static void Main() 
{ 
    TreeScan(@"C:\someFolder"); 
} 

private static void TreeScan(string sDir) 
{ 
    foreach (string f in Directory.GetFiles(sDir)) 
     Console.WriteLine("File: " + f); // or some other file processing 

    foreach (string d in Directory.GetDirectories(sDir)) 
     TreeScan(d); // recursive call to get files of directory 
} 
0

你的GetFiles循環應該在GetDirectories循環之外。並且你的TreeScan不應該在GetDirectories循環中?總之代碼看起來應該是這樣:

private static void TreeScan(string sDir) 
{ 
    foreach (string d in Directory.GetDirectories(sDir)) 
    { 
     TreeScan(d, client); 
    } 
    foreach (string f in Directory.GetFiles(d)) 
    { 
     //Save file f 
    } 
} 
0

如果使用FX4和上述EnumerateFiles方法將返回所有以高效的內存管理,而GetFiles可能需要在大的目錄(或驅動器)的最大資源。

var files = Directory.EnumerateFiles(dir.Path, "*.*");