C#搜索子目录(不适用于文件)

时间:2010-04-01 14:00:52

标签: c# search subdirectory

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

这是否可以不循环遍历所有目录并按名称进行比较?

6 个答案:

答案 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:\\"));