使用目录类进行 C# 搜索

本文关键字:搜索 | 更新日期: 2023-09-27 18:34:48

我正在编写一个软件工具,作为其主要任务的一部分,它必须在目录及其子目录中搜索具有给定名称的目录,并将以指定目录名称终止的每个文件路径保存到字符串数组中。 例如:

                  level_1 level_2 Level_3根目录 ---> 文件夹一个--->文件夹D --->文件夹F --->目标             |           |---> 文件夹E --->目标             |                        |--->文件夹B --->目标             |             |---> 文件夹C --->目标

应抽出:

string[] = {RootDirectory'folderA'FolderD'folderF'Target,  
    RootDirectory'folderA'folderE'Target, 
    Rootdirectory'folderB'Target, 
    RootDirectory'foderC'Target}

最初我在目录信息对象上使用getDirectories(myPath, "Target", SearchOption.AllDirectories),但存在问题。出于某种原因,它会在文件夹 b 和 c 下以及文件夹 A>folderD>folderF 下找到目标,但会跳过文件夹 E。 一旦它在子目录 folderA 中找到第一个匹配项,它就会转到 level_1 处的下一个文件夹。 我应该提到,在我的真实案例中,文件夹 D 实际上是在 folderE 之前按字母顺序排序的,就像在这个例子中一样

因此,我决定使用IEnumerator并运行where过滤器来选择以给定目录名称终止的文件。 这找到了他们所有人。 但是,我不知道如何在IEnumerator上做类似getDirectories().Where(x=>(x.attributes & fileattributes.hidden)==0);的事情.

问题是,我需要它跳过隐藏的SVN目录,因为它大大减慢了该过程。

所以这是我的问题:如何获取子目录中以给定目录名称结尾的所有路径的集合,并从搜索中排除隐藏文件?

使用目录类进行 C# 搜索

我在C:'的根目录中创建了您的文件夹结构,并使用Linqpad提出了以下代码。

string root = "c:''folderA";
string target = "Target";   
var d = new DirectoryInfo(root);
var x = d.EnumerateDirectories(target, SearchOption.AllDirectories);
x.ToList() // for each element, it's in the the FullName 

唯一缺少的部分是忽略.svn文件夹

我认为你将不得不编写自己的实现。 如果你在.net 4.0中,你可以使用枚举目录

并做这样的事情:

private IEnumerable<DirectoryInfo> EnumerateDirectories(DirectoryInfo dir, string target)
{
    foreach (var di in dir.EnumerateDirectories("*",SearchOption.TopDirectoryOnly))
    {
        if ((di.Attributes & FileAttributes.Hidden) != FileAttributes.Hidden)
        {
            if (di.Name.EndsWith(target, StringComparison.OrdinalIgnoreCase))
            {
                 yield return di;
                 continue;
            }
            foreach (var subDir in EnumerateDirectories(di, target))
            {
                yield return subDir;
            }
        }
    }
}

然后:

DirectoryInfo dir = new DirectoryInfo(@"C:'RootDirectory");
var found = EnumerateDirectories(dir,"target").ToArray();

这样,一旦找到"目标"或进入隐藏目录,您就会停止浏览子目录。