我有一些可爱的代码可以为我做一份出色的工作,只需抓取我需要多次搜索的所有文件等。
public static IEnumerable<string> GetFiles(string path, string searchPatternExpression = "", SearchOption searchOption = SearchOption.AllDirectories)
{
Regex reSearchPattern = new Regex(searchPatternExpression);
return Directory.EnumerateFiles(path, "*", searchOption)
.Where(file => reSearchPattern.IsMatch(System.IO.Path.GetExtension(file)));
}
但是,有一个文件夹我不需要在我的某个目录中显示报告。我们将文件夹称为“Narnia”。我知道有一个Directory.Skip
,但我不完全确定如何使用它。
调用GetFiles()的命令;在下面。它只是将返回的列表写出到txt文件。我想知道我可以从那里过滤它吗?
internal static void GetFilesPassThrough(string SearchRoot, string extensions, string savepath) //GetFiles Regex Thread Start.
{
try
{
foreach (string file in GetFiles(SearchRoot, extensions))
using (StreamWriter writer = new StreamWriter(savepath, true))
{
writer.WriteLine(file);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + savepath);
}
}
正如詹姆斯所要求的,我将更深入地提供代码的调用方式。
*按下按钮,调用GetFilesPassThrough(SearchDirectory,Extensions,savepath) *扩展是我需要从目录,.PDF,.txt,.xls等报告的文件 *正如您在GetFilesPassThrough代码中看到的那样,它尝试GetFile()并返回List中名为back的每个字符串。
* 按钮&gt; GetFilesPassThrough&GT;使用获取文件&gt;创建列表并写入textfile *
答案 0 :(得分:2)
if (!(file.Contains("Narnia"))) writer.WriteLine(file)
或者我是否过于简单化和误解?
答案 1 :(得分:2)
我不知道你是想在某处硬编码魔法字符串还是通过某种类型的参数传递,但你可以做类似的事情:
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));
}
(当然这很简单,如果你关心套管,但应该是一个开始。)
修改强>
如果您想要不区分大小写的搜索,可以将其更改为:
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));
}
修改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));
}
请注意,这将忽略与您的忽略集匹配的所有子目录。