【问题标题】:C# Enumerate Files 2 folders down using Directory.GetDirectories()C# 使用 Directory.GetDirectories() 枚举文件 2 个文件夹
【发布时间】:2018-06-27 20:37:43
【问题描述】:

使用 EnumerateDirectories 如何仅向下枚举 2 个文件夹结构。示例:如果我从 C:\ 开始,如何获取 C 内的文件夹以及下一层?

Directory.GetDirectories() 到目前为止唯一提供的是 SearchOption 的

SearchOption.AllDirectories || SearchOption.TopDirectoryOnly

这是我目前所拥有的:

private static List<string> GetDirectories(string path, string searchPattern = "*")
    {
        try
        {
            return Directory.GetDirectories(path, searchPattern, SearchOption.TopDirectoryOnly).ToList();
        }
        catch (UnauthorizedAccessException)
        {
            return new List<string>();
        }
    }

【问题讨论】:

  • 为什么在这里打电话给.ToList()?为什么不直接返回IEnumerable&lt;string&gt;
  • @JoelCoehoorn 我想我可以做到,我必须弄清楚 .ToList() 能给我带来什么好处
  • 好处是减少了内存使用,并可能加快执行速度。
  • 看看这篇文章 - 这是正确的做法:stackoverflow.com/questions/3874516/…
  • 当您在 C:\ 上使用 SearchOption.AllDirectories 时,您可以保证捕获该异常而一无所获。它有一个名为 System Volume Information 的隐藏目录,用于保存还原点数据。默认情况下,即使是管理员也无权访问它。您必须自己递归,远离设置了 FileAttributes.System 的目录。如果您只对 2 个级别的深度感兴趣,也总是想要您想要的。这很重要,因为 3 TB 的驱动器可能需要几分钟才能迭代。

标签: c# directorysearcher


【解决方案1】:

您对关卡使用计数器并递归调用该方法。

未经测试的代码:

private static List<string> GetDirectories(string path, int level, string searchPattern = "*")
{
    if (level == 0)
        return Directory.GetDirectories(path, searchPattern, SearchOption.TopDirectoryOnly).ToList();
    else
    {
        List<string> l = new List<string>();
        foreach (string path2 in Directory.GetDirectories(path, searchPattern, SearchOption.TopDirectoryOnly))
            l.AddRange(GetDirectories(path2, level - 1, searchPattern));
        return l;
    }
}

并像这样调用:

return GetDirectories(yourPath, 1, yourSearchPattern);

或者您可以将其更改为向下钻取,然后返回以进行下一个等,但仍使用计数器。

如果您需要文件(尽管您的问题正文没有提及,只有标题),只需遍历结果,获取每个文件夹中的文件。

【讨论】:

    【解决方案2】:

    您可以这样做,如果您无权访问该目录,则只需添加一些代码。

                        Directory.GetDirectories(path, searchPattern).ToList().ForEach(
                        d =>
                        {
                            try
                            {
                                searchItems.Add(d);
                                searchItems.AddRange(Directory.GetDirectories(d, searchPattern, SearchOption.TopDirectoryOnly));
                            }
                            catch (UnauthorizedAccessException)
                            {
                                //do something when you are not authorized
                            }
                        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-06
      • 1970-01-01
      • 2013-05-12
      • 1970-01-01
      相关资源
      最近更新 更多