我看到的每个例子似乎都是递归地获取子目录中的文件只使用文件。我正在尝试做的是在文件夹中搜索名为“xxx”的特定子目录,然后将该路径保存到变量中,以便将其用于其他内容。
这是否可以不循环遍历所有目录并按名称进行比较?
答案 0 :(得分:11)
好
Directory.GetDirectories(root);
将返回一个子目录数组。
然后你可以使用Linq找到你感兴趣的那个:
IEnumerable<string> list = Directory.GetDirectories(root).Where(s => s.Equals("test"));
这不是代码中的循环,但仍然是循环。所以最终的答案是“没有循环”,你就找不到文件夹'测试'。
您可以将.SingleOrDefault()
添加到Linq,但这取决于您无法找到“test”文件夹时要执行的操作。
如果您更改GetDirectories
调用以包含SearchOption SearchOption.AllDirectories
,那么它也会为您执行递归。显然,在这种情况下,如果目录树中有多个名为“test”的文件夹,则调用可能会返回多个项目。
答案 1 :(得分:7)
var foldersFound = Directory.GetDirectories(root, "test", SearchOption.AllDirectories)
这将返回一个字符串数组,其中包含使用给定名称找到的所有文件夹。您可以更改最后一个参数,以便它只检查顶级目录,您可以更改root以调整它的起始位置。
答案 2 :(得分:1)
首先,“不,没有循环遍历所有目录并按名称进行比较”是不可能的。
我相信你真正的问题是“是否有现成的API可以处理所有目录的循环并按名称进行比较?”
是的,有。它被称为Directory.Exists()
:
var xxxPath = Path.Combine(parentFolder, "xxx");
if (Directory.Exists(xxxPath))
savedPath = xxxPath;
答案 3 :(得分:0)
是的,我相信唯一可用的解决方案(缺少第三方库)是通过名称比较递归搜索目录。
答案 4 :(得分:0)
您也可以使用为.Net提供API的Windows搜索。以下是更详细的信息:Windows Search 4.0 for Developers
答案 5 :(得分: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:\\"));