2010-09-08 120 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

相关问题