2013-02-18 65 views
1

的備份所以,我做一個計劃,使某些特定文件的備份,特別擴展,所以,我用列表或數組與我的擴展輸入whant進行備份製作文件

List<string> extensions = new List<string>(); 
extensions.Add("*.pdf"); 
extensions.Add("*.txt"); 
extensions.Add("*.inf"); 
extensions.Add("*.doc"); 
extensions.Add("*.cpp"); 
extensions.Add("*.cs"); 
extensions.Add("*.vb"); 

好,可是,我怎樣才能使搜索系統,找到與該文件夾的擴展文件..

搜索系統很簡單:

public void DirSearch(string sDir) 
    { 
     try 
     { 
      foreach (string d in Directory.GetDirectories(sDir)) 
      { 
       foreach (string f in Directory.GetFiles(d, "*.pdf")) 
       { 
        Console.WriteLine(f); 
       } 
       DirSearch(d); 
      } 
     } 
     catch (System.Exception excpt) 
     { 
      Console.WriteLine(excpt.Message); 
     } 
    } 

好了,可是,我怎樣才能使這用於搜索所有擴展如果我設置了sDir =「C:\」

回答

1

要簡單地擴展你的目標,你將要進入的目錄需要另一個循環,迭代擴展並基於當前調用GetFiles,但「製造一個最快速的系統」在這個級別上是非常雄心勃勃的。反正...

foreach (string d in Directory.GetDirectories(sDir)) { 
    foreach (string e in extensions) { 
    foreach (string f in Directory.GetFiles(d, e)) { 

    } 
    } 
} 
0

你並不需要一個額外的循環或遞歸,只需使用重載Directory.GetFiles這將讓所有的文件名遞歸

public void DirSearch(string sDir) 
    { 
     try 
     { 
      foreach (string item in extensions) 
      { 
       string[] files = Directory.GetFiles(sDir, item, SearchOption.AllDirectories); 

       foreach (var file in files) 
       { 
        Console.WriteLine(file); 
       } 
      } 
     } 
     catch (System.Exception excpt) 
     { 
      Console.WriteLine(excpt.Message); 
     } 
    } 
1

超負荷使用GetFile與選項SearchOption.AllDirectories,所以你不需要遞歸調用,也可以使用LINQ與SelectMany

var result = extensions.SelectMany(e => 
         Directory.GetFiles(sDir, e, SearchOption.AllDirectories)); 

更新:要忽略受保護的文件夾,您可以使用try catch跳過例外:

private string[] GetFiles(string directory, string pattern) 
{ 
    try 
    { 
     return Directory.GetFiles(directory, pattern, 
             SearchOption.AllDirectories); 
    } 
    catch (Exception) 
    { 
     return new string[0]; 
    } 
} 

所以:

var result = extensions.SelectMany(e => GetFiles(sDir, e)); 
+0

好,但是,我怎麼能讓系統不能進入windows文件夾,例如? – Alexandre 2013-02-18 16:55:26

+0

@亞歷山大:恐怕我不明白你的問題,請你詳細說明一下嗎? – 2013-02-18 16:57:04

+0

因此,例如,如果我把sDir = @「C:\」,系統會嘗試進入windows文件夾,那麼,我怎樣才能讓系統不能進入windows forlder? – Alexandre 2013-02-18 17:00:56

0

您可以提供多個搜索標準,但分隔條件以分號

*.vb;*.txt 

因此,您可以簡單地使用列表生成搜索字符串

var search = string.Join(";", extensions.ToArray()); 
... 
foreach (string f in Directory.GetFiles(d, search)) 
{ 
    ... 
} 
0

調用GetFiles(string Directory)並將結果返回到單個列表中,然後解析它可能會稍微有點高性能。下面的片段應該做你需要的...

var extensions = new List<string> { ".pdf", ".txt", ".inf", ".doc", ".cpp", ".cs", ".vb" }; 
var files = Directory.GetFiles(topLevelFolder, "*.*", SearchOption.AllDirectories); 
var matching = new List<string>(); 
foreach (var ext in extensions) 
{ 
    matching.AddRange(files.Where(f => f.EndsWith(ext))); 
}