8

我看到的每个示例似乎都是为了递归获取子目录中的文件,只使用文件。我要做的是在文件夹中搜索名为“xxx”的特定子目录,然后将该路径保存到变量中,以便我可以将其用于其他事情。

如果不遍历所有目录并按名称进行比较,这是否可行?

4

6 回答 6

14

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”的文件夹,则调用可能会返回多个项目。

于 2010-04-01T14:07:00.417 回答
8
var foldersFound = Directory.GetDirectories(root, "test", SearchOption.AllDirectories)

这将返回一个字符串数组,其中包含以给定名称找到的所有文件夹。您可以更改最后一个参数,使其仅检查顶级目录,您可以更改 root 以调整它的起点。

于 2013-06-03T08:19:52.687 回答
1

首先,“不,不遍历所有目录并按名称进行比较是不可能的”。

我相信您真正的问题是“是否有一个现有的 API 可以处理循环遍历所有目录并按名称进行比较?”

就在这里。它被称为Directory.Exists()

var xxxPath = Path.Combine(parentFolder, "xxx");
if (Directory.Exists(xxxPath))
    savedPath = xxxPath;
于 2010-04-01T14:14:40.247 回答
0

是的,我相信唯一可用的解决方案(缺少第三方库)是通过名称比较递归搜索目录。

于 2010-04-01T14:04:24.120 回答
0

您也可以使用为 .Net 提供 api 的 Windows 搜索。以下是更详细的信息:适用于开发人员的 Windows Search 4.0

于 2010-04-01T14:06:37.013 回答
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:\\"));
于 2018-02-21T13:12:32.523 回答