2009-11-03 67 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