2009-11-03 68 views
7

我有兩個文件的文件夾Directory.GetFiles:使用正則表達式有類似過濾器

  • Awesome.File.20091031_123002.txt
  • Awesome.File.Summary.20091031_123152.txt

此外,第三方應用程序處理文件內容如下:

  • 讀取一個folderPathsearchPattern數據庫外
  • 執行Directory.GetFiles(folderPath, searchPattern),處理任何與批量過濾器匹配的文件,然後將文件移動到存檔文件夾。

事實證明,我必須將我的兩個文件移動到不同的歸檔文件夾中,所以我需要通過提供不同的searchPatterns單獨選擇它們來單獨處理它們。請注意,我無法修改第三方應用程序,但我可以修改數據庫中的searchPattern和文件目標。

什麼searchPattern將讓我選擇Awesome.File.20091031_123002.txt而不包括Awesome.File.Summary.20091031_123152.txt

+0

他們是永遠的格式'Name.File.date_time.txt'和'Name.File.Summary.date_time.txt'的? – 2009-11-03 20:23:01

回答

8

Awesome.File.????????_??????.txt

的問號(?)作爲一個單獨的字符佔位符。

+0

+1,+回答:真棒:) – Juliet 2009-11-03 20:31:50

5

根據documentation,searchPattern只支持*****和通配符。你需要編寫自己的正則表達式過濾器,它接受Directory.GetFiles的結果並應用進一步的過濾邏輯。

6

我想在這裏盡我微薄的LINQ技能......我敢肯定有一個更好的解決方案,但這裏是我的:

string pattern = ".SUMMARY."; 
string[] awesomeFiles = System.IO.Directory.GetFiles("path\\to\\awesomefiles"); 

     IEnumerable<string> sum_files = from file in awesomeFiles 
             where file.ToUpper().Contains(pattern) 
             select file; 

     IEnumerable<string> other_files = from file in awesomeFiles 
             where !file.ToUpper().Contains(pattern) 
             select file; 

這是假設沒有任何其他目錄中的文件除了這兩個,但你可以在這裏調整模式以滿足你的需要(即在模式開始時添加「Awesome.File」)。

當你迭代每一個的集合時,你應該得到你所需要的。

+0

*嗅*我開始回答之前,我看到了接受。好吧。享受,如果你可以使用:)。 – 2009-11-03 20:45:16

+0

+1爲你加油:-) – 2011-08-26 06:49:46

9

如果你打算使用LINQ然後...

var regexTest = new Func<string, bool>(i => Regex.IsMatch(i, @"Awesome.File.(Summary)?.[\d]+_[\d]+.txt", RegexOptions.Compiled | RegexOptions.IgnoreCase)); 
    var files = Directory.GetFiles(@"c:\path\to\folder").Where(regexTest); 
0

如果你不想使用Linq,這裏有一個方法。

公用Sub FileChecker(BYVAL文件路徑作爲字符串)

Dim di As New DirectoryInfo(filePath) 
    Dim _MatchCounter As Integer 
    Dim RegexPattern As String = "^[a-zA-Z_a-zA-Z_a-zA-Z_0-9_0-9_0-9.csv]*$" 
    Dim RegexPatternMatch As New Regex(RegexPattern, RegexOptions.IgnoreCase) 

    For Each matchingFile As FileInfo In di.GetFiles() 

     Dim m As Match = RegexPatternMatch.Match(matchingFile.Name) 

     If (m.Success) Then 
      MessageBox.Show(matchingFile.Name) 
      _MatchCounter += 1 
     End If 

    Next 

End Sub