我不知道您是否想要在某处硬编码一个魔术字符串或通过某种参数传递,但您可以执行以下操作:
public static IEnumerable<string> GetFiles(
string path, string searchPatternExpression = "",
SearchOption searchOption = SearchOption.AllDirectories,
params string[] toIgnore)
{
Regex reSearchPattern = new Regex(searchPatternExpression);
return Directory.EnumerateFiles(path, "*", searchOption)
.Where(file => reSearchPattern.IsMatch(System.IO.Path.GetExtension(file)))
.Where(file => !toIgnore.Contains(file));
}
(当然,如果您关心大小写,这很简单,但应该是一个开始。)
Edit
如果您想要不区分大小写的搜索,您可以将其更改为如下所示:
public static IEnumerable<string> GetFiles(
string path, string searchPatternExpression = "",
SearchOption searchOption = SearchOption.AllDirectories,
params string[] toIgnore)
{
var hash = new HashSet<string>(toIgnore, StringComparer.InvariantCultureIgnoreCase);
Regex reSearchPattern = new Regex(searchPatternExpression);
return Directory.EnumerateFiles(path, "*", searchOption)
.Where(file => reSearchPattern.IsMatch(System.IO.Path.GetExtension(file)))
.Where(file => !hash.Contains(file));
}
Edit 2
如果您想跳过目录使用给定的名称,尝试:
public static IEnumerable<string> GetFiles(
string path, string searchPatternExpression = "",
SearchOption searchOption = SearchOption.AllDirectories,
params string[] toIgnore)
{
var hash = new HashSet<string>(toIgnore, StringComparer.InvariantCultureIgnoreCase);
Regex reSearchPattern = new Regex(searchPatternExpression);
return Directory.EnumerateDirectories(path, "*", searchOption)
.Where(folder => !hash.Contains(Path.GetDirectoryName(folder)))
.SelectMany(x => Directory.EnumerateFiles(x, "*", searchOption));
}
请注意,这将忽略all与您的忽略集匹配的子目录。