我看到的每个示例似乎都是为了递归获取子目录中的文件,只使用文件。我要做的是在文件夹中搜索名为“xxx”的特定子目录,然后将该路径保存到变量中,以便我可以将其用于其他事情。
如果不遍历所有目录并按名称进行比较,这是否可行?
我看到的每个示例似乎都是为了递归获取子目录中的文件,只使用文件。我要做的是在文件夹中搜索名为“xxx”的特定子目录,然后将该路径保存到变量中,以便我可以将其用于其他事情。
如果不遍历所有目录并按名称进行比较,这是否可行?
好
Directory.GetDirectories(root);
将返回一个子目录数组。
然后,您可以使用 Linq 找到您感兴趣的那个:
IEnumerable<string> list = Directory.GetDirectories(root).Where(s => s.Equals("test"));
这不是您的代码中的循环,但仍然是一个循环。所以最终的答案是“不,没有循环就找不到文件夹'test'”。
您可以添加.SingleOrDefault()
到 Linq,但这取决于如果找不到“测试”文件夹,您想要做什么。
如果您将GetDirectories
调用更改为包含 SearchOption,SearchOption.AllDirectories
那么它也会为您执行递归。此版本支持搜索 - 您必须提供搜索字符串 - 尽管在 .NET Framework 中它是区分大小写的搜索。"*"
要返回您作为搜索词传递的所有子目录。
显然,在这种情况下,如果目录树中有多个名为“test”的文件夹,则调用可能会返回多个项目。
var foldersFound = Directory.GetDirectories(root, "test", SearchOption.AllDirectories)
这将返回一个字符串数组,其中包含以给定名称找到的所有文件夹。您可以更改最后一个参数,使其仅检查顶级目录,您可以更改 root 以调整它的起点。
首先,“不,不遍历所有目录并按名称进行比较是不可能的”。
我相信您真正的问题是“是否有一个现有的 API 可以处理循环遍历所有目录并按名称进行比较?”
就在这里。它被称为Directory.Exists()
:
var xxxPath = Path.Combine(parentFolder, "xxx");
if (Directory.Exists(xxxPath))
savedPath = xxxPath;
是的,我相信唯一可用的解决方案(缺少第三方库)是通过名称比较递归搜索目录。
您也可以使用为 .Net 提供 api 的 Windows 搜索。以下是更详细的信息:适用于开发人员的 Windows Search 4.0
这是在考虑 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:\\"));