2010-09-08 119 views
4

我有一個C#應用程序,它使用搜索功能來查找目錄中的所有文件,然後在列表中顯示它們。我需要能夠根據擴展名(可能使用搜索功能)目錄(例如,阻止任何在「測試」或「調試」目錄中顯示)過濾文件。正則表達式解析出文件名和部分路徑,有條件地

我當前的代碼是一樣的東西:

Regex filter = new Regex(@"^docs\(?!debug\)(?'display'.*)\.(txt|rtf)"); 
String[] filelist = Directory.GetFiles("docs\\", "*", SearchOption.AllDirectories); 
foreach (String file in filelist) 
{ 
    Match m = filter.Match(file); 
    if (m.Success) 
    { 
     listControl.Items.Add(m.Groups["display"]); 
    } 
} 

(這是某種程度的簡化和鞏固,是從文件中讀取一個字符串創建實際的正則表達式,我做更多的錯誤之間的檢查)。

我需要能夠挑選出一段(通常是相對路徑和文件名)作爲顯示名稱,而忽略任何具有特定文件夾名稱的文件作爲其路徑的一部分。例如,對於這些文件,只能用+ S的人應符合:

+ docs\info.txt 
- docs\data.dat 
- docs\debug\info.txt 
+ docs\world\info.txt 
+ docs\world\pictures.rtf 
- docs\world\debug\symbols.rtf 

我正則表達式適用於大多數的,除了我不知道如何使它失敗的最後一個文件。有關如何完成這項工作的任何建議?

+0

在你的正則表達式中仍然出現拼寫錯誤:你需要避開反斜槓('\\'),否則它們會將你的先行的括號轉義爲文字圓括號。 – 2010-09-08 08:27:33

回答

2
^docs\\(?:(?!\bdebug\\).)*\.(?:txt|rtf)$ 

將匹配的字符串

  1. 開始於docs\
  2. 不包含debug\任何地方(在\b錨確保我們匹配debug作爲整個字)和
  3. .txt.rtf結尾。
3

嘗試Directory.GetFiles。這應該做你想做的。

實施例:

// Only get files that end in ".txt" 
string[] dirs = Directory.GetFiles(@"c:\", "*.txt", SearchOption.AllDirectories); 
Console.WriteLine("The number of files ending with .txt is {0}.", dirs.Length); 
foreach (string dir in dirs) 
{ 
    Console.WriteLine(dir); 
} 
+0

這就是我正在使用的功能,實際上(代碼示例中的錯字)。我的問題是它不會過濾掉那個目錄下的「壞」子目錄中的文件。我還需要將過濾器保存在一個文件中(儘管也可以使用GetFiles來完成)。 – ssube 2010-09-08 02:08:48

相關問題