C# 从文件搜索中排除目录

C# 从文件搜索中排除目录,c#,.net,linq,C#,.net,Linq,我正在搜索特定文件夹中具有特定文件扩展名的所有文件,但我想排除一些不应搜索的子目录。我为文件扩展名编写了以下代码,但不知道如何排除文件夹。DirList是我要从搜索中排除的文件夹 void DirSearch(string sDir) { List<string> DirList = new List<string>(); DirList.Add("Combustor"); DirList.Add("INLET

我正在搜索特定文件夹中具有特定文件扩展名的所有文件,但我想排除一些不应搜索的子目录。我为文件扩展名编写了以下代码,但不知道如何排除文件夹。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);

        }
    }
void DirSearch(字符串sDir)
{
List DirList=新列表();
添加(“燃烧室”);
目录。添加(“入口”);
字符串[]扩展名={.c'、“.h”、“.isi”、“.isc”、“.xml”、“.sheet”};
foreach(目录中的字符串文件。枚举文件(
sDir,“**”,SearchOption.AllDirectories)。其中(s=>extensions.Any(ext=>ext==Path.GetExtension(s)))
{
UpdaterUtility.UpdateFile(文件);
}
}

这有点幼稚,但确实起到了作用:

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);

    }
}
void DirSearch(字符串sDir)
{
List DirList=新列表();
添加(“燃烧室”);
目录。添加(“入口”);
字符串[]扩展名={.c'、“.h”、“.isi”、“.isc”、“.xml”、“.sheet”};
foreach(目录中的字符串文件。枚举文件(
sDir,“**”,SearchOption.AllDirectories)
.Where(s=>!DirList.Any(d=>s.StartsWith(d,StringComparison.InvariantCultureIgnoreCase))
&&extensions.Any(ext=>ext==Path.GetExtension(s)))
{
UpdaterUtility.UpdateFile(文件);
}
}

为什么这么简单:首先,它会枚举所有文件,甚至是那些被忽略的目录中的文件,如果不需要的文件数量远远大于需要的文件数量,那么您会进行不必要的处理。

这有点简单,但会做以下工作:

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);

    }
}
void DirSearch(字符串sDir)
{
List DirList=新列表();
添加(“燃烧室”);
目录。添加(“入口”);
字符串[]扩展名={.c'、“.h”、“.isi”、“.isc”、“.xml”、“.sheet”};
foreach(目录中的字符串文件。枚举文件(
sDir,“**”,SearchOption.AllDirectories)
.Where(s=>!DirList.Any(d=>s.StartsWith(d,StringComparison.InvariantCultureIgnoreCase))
&&extensions.Any(ext=>ext==Path.GetExtension(s)))
{
UpdaterUtility.UpdateFile(文件);
}
}

为什么这么简单:首先,它会枚举所有文件,甚至是那些被忽略的目录中的文件,如果不需要的文件数量远远大于需要的文件数量,那么您就需要进行不必要的处理。

不幸的是,没有内置的方法来过滤特定的目录。因此,您必须递归地执行此搜索:

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));
    }
}
void DirSearch(字符串sDir)
{
List DirList=新列表();
添加(“燃烧室”);
目录。添加(“入口”);
字符串[]扩展名={.c'、“.h”、“.isi”、“.isc”、“.xml”、“.sheet”};
//仅枚举此目录中的文件(无子目录)
foreach(目录中的字符串文件。枚举文件(
sDir,“**”,SearchOption.TopDirectoryOnly)。其中(s=>extensions.Any(ext=>ext==Path.GetExtension(s)))
{
UpdaterUtility.UpdateFile(文件);
}
//现在递归子目录
foreach(Directory.GetDirectories中的字符串subdir(
sDir,“*”,SearchOption.TopDirectoryOnly)。
其中(sd=>sd!=“&&sd!=”。“&&&&!DirList.Contains(sd)))
{
DirSearch(Path.Combine(sDir,subdir));
}
}

不幸的是,没有内置的方法来过滤特定的目录。因此,您必须递归地执行此搜索:

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));
    }
}
void DirSearch(字符串sDir)
{
List DirList=新列表();
添加(“燃烧室”);
目录。添加(“入口”);
字符串[]扩展名={.c'、“.h”、“.isi”、“.isc”、“.xml”、“.sheet”};
//仅枚举此目录中的文件(无子目录)
foreach(目录中的字符串文件。枚举文件(
sDir,“**”,SearchOption.TopDirectoryOnly)。其中(s=>extensions.Any(ext=>ext==Path.GetExtension(s)))
{
UpdaterUtility.UpdateFile(文件);
}
//现在递归子目录
foreach(Directory.GetDirectories中的字符串subdir(
sDir,“*”,SearchOption.TopDirectoryOnly)。
其中(sd=>sd!=“&&sd!=”。“&&&&!DirList.Contains(sd)))
{
DirSearch(Path.Combine(sDir,subdir));
}
}

给你!只需添加一个检查,看看排除的目录是否是路径的最后一部分。此外,在目录名称的开头包含反斜杠“\”

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);

    }
}
void DirSearch(字符串sDir)
{
List DirList=新列表();
添加(“\\燃烧室.ToUpper());
DirList.Add(“\\INLET.ToUpper());
字符串[]扩展名={.c'、“.h”、“.isi”、“.isc”、“.xml”、“.sheet”、“.txt”};
foreach(Directory.EnumerateFiles(sDir,“***”,SearchOption.AllDirectories)中的字符串文件)
.Where(s=>!DirList.Any(d=>Path.GetDirectoryName.ToUpper().Contains(d))&&extensions.Any(ext=>ext==Path.GetExtension)))
{
Console.WriteLine(文件);
}
}

给你!只需添加一个检查,看看排除的目录是否是路径的最后一部分。此外,在目录名称的开头包含反斜杠“\”

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);

    }
}
void DirSearch(字符串sDir)
{
List DirList=新列表();
添加(“\\燃烧室.ToUpper());
DirList.Add(“\\INLET.ToUpper());
字符串[]扩展名={.c'、“.h”、“.isi”、“.isc”、“.xml”、“.sheet”、“.txt”};
foreach(Directory.EnumerateFiles(sDir,“***”,SearchOption.AllDirectories)中的字符串文件)
.Where(s=>!DirList.Any(d=>Path.GetDirectoryName.ToUpper().Contains(d))&&extensions.Any(ext=>ext==Path.GetExtension)))
{
Console.WriteLine(文件);
}
}

进入排除目录如果排除目录包含子目录,则可以将结尾更改为包含。进入排除目录如果排除目录包含子目录,则可以将结尾更改为包含。