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