我有一个C#应用程序,它使用搜索功能查找目录中的所有文件,然后在列表中显示它们。我需要能够根据扩展名(可能使用搜索功能)和目录过滤文件(例如,阻止“test”或“debug”目录中的任何一个显示)。
我目前的代码如下:
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"]);
}
}
(这有点简化和整合,实际的正则表达式是从一个从文件中读取的字符串创建的,我在其间做了更多的错误检查。)
我需要能够选择一个部分(通常是相对路径和文件名)作为显示名称,同时忽略任何具有特定foldername作为其路径部分的文件。例如,对于这些文件,只有+ 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 :(得分: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);
}
答案 1 :(得分:2)
^docs\\(?:(?!\bdebug\\).)*\.(?:txt|rtf)$
将匹配
的字符串docs\
,debug\
(\b
锚定确保我们将debug
与整个单词匹配),.txt
或.rtf
结尾。