3

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

                   级别_1 级别_2 级别_3
RootDirectory ---> 文件夹A ---> 文件夹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 下找到目标,但会跳过 FolderE。一旦它在子目录文件夹 A 中找到第一个匹配项,它将继续到 level_1 的下一个文件夹。我应该提到,在我的真实案例中,folderD 实际上是按字母顺序排列在 folderE 之前的,就像在这个例子中一样

因此,我决定使用IEnumerator并运行 where 过滤器来选择以给定目录名称终止的文件。这让他们都找到了。但是,我无法弄清楚如何getDirectories().Where(x=>(x.attributes & fileattributes.hidden)==0);IEnumerator.

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

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

4

2 回答 2

1

我在我的根目录中创建了您的文件夹结构,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文件夹

于 2012-05-21T22:38:27.940 回答
0

我认为您将不得不编写自己的实现。如果您使用的是 .net 4.0,则可以使用EnumerateDirectories

并做这样的事情:

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();

这样,一旦你找到一个“目标”,或者遇到一个隐藏目录,你就停止浏览子目录。

于 2012-05-21T23:17:00.743 回答