从文件搜索中排除目录

时间:2016-03-22 17:36:13

标签: c# .net linq

我正在搜索特定文件夹中具有特定文件扩展名的所有文件,但我想排除一些不应搜索的子目录。我为文件扩展名编写了以下代码,但不知道如何排除文件夹.DirList是我想从搜索中排除的文件夹

   void DirSearch(string sDir)
    {
        List<string> DirList = new List<string>();
        DirList.Add("Combustor");
        DirList.Add("INLET");

        string[] extensions = { ".c", ".h", ".isi", ".isc", ".xml", ".sheet" };

        foreach (string file in Directory.EnumerateFiles(
               sDir, "*.*", SearchOption.AllDirectories).Where(s => extensions.Any(ext => ext == Path.GetExtension(s))))
        {
            UpdaterUtility.UpdateFile(file);

        }
    }

3 个答案:

答案 0 :(得分:1)

你走了!只需添加一个检查以查看排除的dir是否是路径的最后一部分。另外,包括反斜杠&#34; \&#34;在dir名称的开头。

void DirSearch(string sDir)
{
    List<string> DirList = new List<string>();
    DirList.Add("\\Combustor".ToUpper());
    DirList.Add("\\INLET".ToUpper());

    string[] extensions = { ".c", ".h", ".isi", ".isc", ".xml", ".sheet", ".txt" };

    foreach (string file in Directory.EnumerateFiles(sDir, "*.*", SearchOption.AllDirectories)
                                     .Where(s => !DirList.Any(d => Path.GetDirectoryName(s).ToUpper().Contains(d)) && extensions.Any(ext => ext == Path.GetExtension(s))))
    {
        Console.WriteLine(file);

    }
}

答案 1 :(得分:0)

这有点天真,但做的工作是:

void DirSearch(string sDir)
{
    List<string> DirList = new List<string>();
    DirList.Add("Combustor");
    DirList.Add("INLET");

    string[] extensions = { ".c", ".h", ".isi", ".isc", ".xml", ".sheet" };

    foreach (string file in Directory.EnumerateFiles(
           sDir, "*.*", SearchOption.AllDirectories)
    .Where(s =>!DirList.Any(d => s.StartsWith(d, StringComparison.InvariantCultureIgnoreCase)) 
    && extensions.Any(ext => ext == Path.GetExtension(s))))
    {
        UpdaterUtility.UpdateFile(file);

    }
}

为什么它是天真的:首先它枚举所有文件,即使是被忽略的目录中的文件,如果不需要的文件数量比想要的文件大得多,你就会进行不必要的处理。

答案 2 :(得分:0)

不幸的是,没有内置的方法来过滤掉特定的目录。所以你必须递归地进行搜索:

void DirSearch(string sDir)
{
    List<string> DirList = new List<string>();
    DirList.Add("Combustor");
    DirList.Add("INLET");

    string[] extensions = { ".c", ".h", ".isi", ".isc", ".xml", ".sheet" };

    // enumerate only files in this directory (no sub directories)
    foreach (string file in Directory.EnumerateFiles(
           sDir, "*.*", SearchOption.TopDirectoryOnly).Where(s => extensions.Any(ext => ext == Path.GetExtension(s))))
    {
        UpdaterUtility.UpdateFile(file);
    }

    // now recurse the subdirectories
    foreach (string subdir in Directory.GetDirectories(
           sDir, "*", SearchOption.TopDirectoryOnly).
        Where(sd => sd != "." && sd != ".." && !DirList.Contains(sd)))
    {
        DirSearch(Path.Combine(sDir, subdir));
    }
}