使用Directory.GetFiles与类似regex的过滤器

时间:2009-11-03 20:18:44

标签: c#

我有一个包含两个文件的文件夹:

  • 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的内容是什么?

5 个答案:

答案 0 :(得分: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);

答案 1 :(得分:8)

  

Awesome.File。???????? _ ??????。TXT

问号(?)充当单个字符占位符。

答案 2 :(得分: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”添加到模式开始。)

当你迭代每个的集合时,你应该得到你需要的东西。

答案 3 :(得分:5)

根据documentation searchPattern 仅支持*****和通配符。您需要编写自己的正则表达式过滤器,该过滤器获取Directory.GetFiles的结果并应用进一步的过滤逻辑。

答案 4 :(得分:0)

如果你不想使用Linq,可以单程。

public void FileChecker(string filePath)
{
    DirectoryInfo di = new DirectoryInfo(filePath);
    int _MatchCounter;
    string RegexPattern = "^[a-zA-Z_a-zA-Z_a-zA-Z_0-9_0-9_0-9.csv]*$";
    Regex RegexPatternMatch = new Regex(RegexPattern, RegexOptions.IgnoreCase);

    foreach (FileInfo matchingFile in di.GetFiles())
    {
        Match m = RegexPatternMatch.Match(matchingFile.Name);

        if ((m.Success))
        {
            MessageBox.Show(matchingFile.Name);
            _MatchCounter += 1;
        }
    }
}