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

C#搜索子目录(不搜索文件),c#,search,subdirectory,C#,Search,Subdirectory,我看到的每个例子似乎都是递归地获取子目录中的文件,而只使用文件。我要做的是在一个文件夹中搜索一个名为“xxx”的特定子目录,然后将该路径保存到一个变量中,这样我就可以将它用于其他事情 如果不循环遍历所有目录并按名称进行比较,这是可能的吗?是的,我认为唯一可用的解决方案(缺少第三方库)是通过名称比较对目录进行递归搜索。您也可以使用为.Net提供api的Windows search。这里有更详细的信息:好的 Directory.GetDirectories(root); 将返回子目录数组 然后,您

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


如果不循环遍历所有目录并按名称进行比较,这是可能的吗?

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

您也可以使用为.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
调用以包括SearchOption
SearchOption.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:\\"));