目录枚举以跳过文件夹

时间:2013-10-15 16:10:54

标签: c#

我有一些可爱的代码可以为我做一份出色的工作,只需抓取我需要多次搜索的所有文件等。

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 *

2 个答案:

答案 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));
}

请注意,这将忽略与您的忽略集匹配的所有子目录。