C#搜索子目录(不搜索文件)
我看到的每个例子似乎都是递归地获取子目录中的文件,而只使用文件。我要做的是在一个文件夹中搜索一个名为“xxx”的特定子目录,然后将该路径保存到一个变量中,这样我就可以将它用于其他事情C#搜索子目录(不搜索文件),c#,search,subdirectory,C#,Search,Subdirectory,我看到的每个例子似乎都是递归地获取子目录中的文件,而只使用文件。我要做的是在一个文件夹中搜索一个名为“xxx”的特定子目录,然后将该路径保存到一个变量中,这样我就可以将它用于其他事情 如果不循环遍历所有目录并按名称进行比较,这是可能的吗?是的,我认为唯一可用的解决方案(缺少第三方库)是通过名称比较对目录进行递归搜索。您也可以使用为.Net提供api的Windows search。这里有更详细的信息:好的 Directory.GetDirectories(root); 将返回子目录数组 然后,您
如果不循环遍历所有目录并按名称进行比较,这是可能的吗?是的,我认为唯一可用的解决方案(缺少第三方库)是通过名称比较对目录进行递归搜索。您也可以使用为.Net提供api的Windows search。这里有更详细的信息:好的
Directory.GetDirectories(root);
将返回子目录数组
然后,您可以使用Linq查找您感兴趣的:
IEnumerable<string> list = Directory.GetDirectories(root).Where(s => s.Equals("test"));
IEnumerable list=Directory.GetDirectories(root).Where(s=>s.Equals(“test”);
它在代码中不是循环,但仍然是循环。因此,最终的答案是“不,如果没有循环,就找不到文件夹‘test’”
您可以将.SingleOrDefault()
添加到Linq,但这取决于在找不到“test”文件夹时要执行的操作
如果您更改GetDirectories
调用以包括SearchOptionSearchOption.AllDirectories
,那么它也将为您执行递归。此版本支持搜索-您必须提供搜索字符串-尽管在.NET Framework中它是区分大小写的搜索。返回作为搜索词传递的所有子目录
显然,在这种情况下,如果目录树中有多个名为“test”的文件夹,则调用可能返回多个项目。首先,“不,如果不循环遍历所有目录并按名称进行比较,则不可能”
我相信你真正的问题是“是否有一个现有的API可以处理所有目录的循环并为我按名称进行比较?”
是的,有。它被称为目录.Exists()
:
这将返回一个字符串数组,其中包含使用给定名称找到的所有文件夹。您可以更改最后一个参数,使其仅检查顶级目录,也可以更改根目录以调整其起始位置。以下是一个用于使用两个筛选器搜索文件夹的片段,同时考虑UnauthorizedAccessException,可以将其重构为仅使用一个筛选器:
public static string FindGitPath(string firstFilter, string secondFilter, string initialPath)
{
string gitPath = string.Empty;
foreach (var i in Directory.GetDirectories(initialPath)) {
try {
foreach (var f in Directory.GetDirectories(i, firstFilter, SearchOption.AllDirectories)) {
foreach (var s in Directory.GetDirectories(f)) {
if (s == Path.Combine(f,secondFilter)) {
gitPath = f;
break;
}
}
}
} catch (UnauthorizedAccessException) {
Console.WriteLine("Path is not accessible: {0}", i);
}
}
return gitPath;
}
用法示例:
Console.WriteLine("Retrieved the git database folder as {0}", FindGitPath("database",".git", "c:\\"));
NET 4中的一个增强功能是Directory.EnumerateDirectory,它不会强制您将整个目录列表加载到数组中。它直接返回IEnumerable。还有文件的Directory.enumerate文件。是否可以跳过被禁止的目录?比如你在C:\中搜索,不想在windows等中搜索?
public static string FindGitPath(string firstFilter, string secondFilter, string initialPath)
{
string gitPath = string.Empty;
foreach (var i in Directory.GetDirectories(initialPath)) {
try {
foreach (var f in Directory.GetDirectories(i, firstFilter, SearchOption.AllDirectories)) {
foreach (var s in Directory.GetDirectories(f)) {
if (s == Path.Combine(f,secondFilter)) {
gitPath = f;
break;
}
}
}
} catch (UnauthorizedAccessException) {
Console.WriteLine("Path is not accessible: {0}", i);
}
}
return gitPath;
}
Console.WriteLine("Retrieved the git database folder as {0}", FindGitPath("database",".git", "c:\\"));