C# 中的文件和文件夹的递归列表[关闭]

2023-12-31

我编写此代码是为了在 C# 中递归列出文件和文件夹。

            var filesInTheCurrentDirectory = System.IO.Directory.GetFiles(rootFolder);
            if (!filesInTheCurrentDirectory.Any() && !System.IO.Directory.GetDirectories(rootFolder).ToList().Any())
            {
                return;
            }

            filesInTheCurrentDirectory.ToList().ForEach(file => System.IO.File.AppendAllText("e:\\personal\\tests.txt", System.IO.Path.GetFileName(file) + ":" + rootFolder + "\n"));
            System.IO.Directory.GetDirectories(rootFolder).ToList().ForEach(recursivePrintFolders);

虽然这只是效果很好, 问题是:

  1. 我正在使用递归。是这样的吗best? (我尝试编写一个非递归函数但卡住了,因为我们不知道每个文件夹的深度是多少提前)。

  2. 如何评价这个功能的性能?是吗OlogN or O(n)? (我很困惑,因为没有循环版本。据我所知,如果有两个for循环,我可以称之为O(n^2).)

有什么想法或指导吗?


使用递归来执行此操作的主要问题是:

  1. 如果您的树的深度太大,您可能没有足够的堆栈空间。虽然拥有那么深的文件系统结构并不常见,但这并非不可想象。

  2. 您使用的内存超过了所需的内存,因为您在堆栈帧中保存了许多可以避免的数据。

至于渐近复杂度,无论其大小如何,每个节点都执行一次操作,因此它的复杂度为 O(n),其中 n 是所有节点,而不是任何给定深度的节点。

但是,您可以使用内置方法遍历整个树来更有效地处理所有这些。即使您的解决方案是非递归的,它也会比您提出的解决方案更有效,只需使用:

foreach(string file in Directory.EnumerateFiles(path, "*", 
    SearchOption.AllDirectories))
{
    System.IO.File.AppendAllText("e:\\personal\\tests.txt",
        System.IO.Path.GetFileName(file) + ":" + rootFolder + "\n")
}

虽然该解决方案可能不使用递归,但如果您想知道如何自己编写非递归树遍历,则可以使用如下通用方法:

public static IEnumerable<T> Traverse<T>(
    this IEnumerable<T> source
    , Func<T, IEnumerable<T>> childrenSelector)
{
    var stack = new Stack<T>(source);
    while (stack.Any())
    {
        var next = stack.Pop();
        yield return next;
        foreach (var child in childrenSelector(next))
            stack.Push(child);
    }
}

在你的情况下,调用它可能看起来像这样:

var allFiles = new[] { new DirectoryInfo(path) }
    .Traverse(directory => directory.EnumerateDirectories())
    .Select(directory => directory.EnumerateFiles());

请注意,虽然这对于遍历不提供完整遍历的内置方式的树来说很好,但这通常对于遍历文件系统来说并不理想。您应该使用第一个解决方案,因为它已经针对遍历文件系统的特殊情况进行了高度优化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 中的文件和文件夹的递归列表[关闭] 的相关文章

  • 如何转发声明要在 unique_ptr 的标准容器中使用的类

    在智能指针的标准容器中使用它时 是否可以避免完整的类定义可见 例如 我无法编译以下内容 include
  • 更改图像颜色与透明背景

    我需要使用 c System Drawings 将透明背景上带有绿色圆圈的图像加载到位图图像中 这是最简单的部分 但是 我需要在将其添加到更大的图像之前更改圆圈的颜色 而不影响周围的透明度 就我而言 我需要将圆圈颜色更改为黄色并将其添加为太
  • C++:字符串流有什么好处?

    谁能告诉我一些在 C 中使用字符串流的实际例子 即使用流插入和流提取运算符输入和输出到字符串流 您可以使用字符串流来转换任何实现operator lt lt 到一个字符串 include
  • 提取单花括号内的值

    我想要一个收藏 value 一个字符串使用正则表达式 例如 lorem ipsum field1 lorem ipsum field2 lorem ipsum field1 lorem ipsum field2 field3 我会得到 fi
  • .NET 中的 Class.forName() 等效项?

    动态获取对象类型然后创建它的新实例的 C 方法是什么 例如 如何在 C 中实现以下 Java 代码的结果 MyClass x MyClass Class forName classes MyChildClass newInstance Lo
  • 值类型如何实现引用类型

    我遇到了一个值类型正在实现 ref 的场景 类型 只是想知道这怎么可能 幕后发生了什么 结构体是值类型 接口是引用 类型但结构可以实现接口而不会出现任何错误 有什么想法吗 提前致谢 实际上 它同时以两种不同的方式进行 首先 任何值类型都可以
  • C 中的 '\0' 和 printf()

    在 C 入门课程中 我了解到在存储字符串时存储空字符 0在它的最后 但是如果我想打印一个字符串怎么办 printf hello 虽然我发现它并没有结束 0通过以下声明 printf d printf hello Output 5 但这似乎不
  • 带有嵌入 Flash 视频的 PDF 示例?

    有谁知道我在哪里可以查看嵌入 Flash 视频的 PDF 示例 我知道问这个问题很愚蠢 因为你会认为任何面向技术的用户都应该能够使用谷歌找到一个 但我真的找不到 我的另一个问题是 使用 C 中的 API 将 Flash 视频嵌入 PDF 文
  • C 链表销毁函数

    我正在尝试学习 C 和很多人一样 我对指针有点困惑 无论如何 我创建了一个递归函数来销毁我的链表 但是正如我调试的那样 当我从函数返回时 列表的头部不应该为空 所以我猜这是对指针的一些基本误解 这是函数 void destroy struc
  • 为什么 ObservableCollection 有两个集合构造函数?

    The 可观察集合 T https msdn microsoft com en us library ms668604类有两个构造函数 可以在其中传递项目集合 一个构造函数接受一个IEnumerable T 另一个List T 鉴于List
  • 微软怎么能说WinAPI中一个字的大小是16位呢?

    我刚刚开始学习WinAPI 在MSDN中 对WORD数据类型提供了以下解释 WORD16 位无符号整数 范围是十进制 0 到 65535 该类型在 WinDef h 中声明如下 typedef 无符号短 WORD 很简单 而且它与我一直在使
  • 如何在Unity Inspector中创建多维数组?

    如何在 Unity Inspector 中创建枚举多维数组并使其可序列化 以便我可以从不同的脚本调用它 public enum colors red blue green yellow cyan white purple public in
  • 可以通过模板间接访问基类中的私有类型

    我试图在编译时根据类型是否在给定范围内公开可用来选择要使用的类型 最好直接看代码 include
  • _MM_TRANSPOSE4_PS 在 GCC 中导致编译器错误?

    我第一次在 GCC 而不是 MSVC 中编译我的数学库 并经历了所有的小错误 我遇到了一个根本没有意义的错误 Line 284 error lvalue required as left operand of assignment 284号
  • 如何解析多态 JSON 数组?

    我有一个 JSON 格式的文件 其中包含个人用户的记录 一些用户的记录中间有一个评论字段 我只想解析顶级项目 全名 贡献者姓名 电子邮件 使用 Newtonsoft JSON 解析器 但我似乎无法让它识别单个对象 当我将整个字符串解析为一个
  • 解析连接字符串

    是否有标准库或代码片段可以使用这样的连接字符串获取值 string connstr DataServiceUrl http localhost foo RemoteServerConnection server http localhost
  • 当一对迭代器初始化时,向量是否知道先保留?

    考虑以下代码 struct MyData MyData const BYTE pData size t uSize bucket pData pData uSize std vector
  • 如何在 stl 模板中使用导出类 (__declspec(dllexport))?

    我正在使用导出的类 class declspec dllexport myclass private template declspec dllexport class std map
  • Membership.ValidateUser() 的目的是什么

    我一直在学习有关MembershipProvider类 我认为Membership ValidateUser 方法应该用于登录用户 然而我刚刚了解到有一个FormsAuthentication Authenticate 目的是什么Valid
  • 从其对象获取结构体字段的名称和类型

    例如 我有一个类似这样的结构 struct Test int i float f char ch 10 我有一个该结构的对象 例如 Test obj 现在 我想以编程方式获取字段名称和类型obj 是否可以 顺便说一句 这是 C 你正在要求C

随机推荐

  • Code Golf:验证数独网格

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 介绍 有效的数独网格由数字 1 到 9 填充 并且数字在 9 行或列的每个子块中出现的次数不会
  • Grails jQuery Mobile 应用程序中的 Spring Security 刷新错误

    我有一个 Grails 2 0 1 jQuery Mobile 应用程序 这是我第一次使用 Spring Security 我遵循了 Peter Ledbrook 的出色指示post http blog springsource org 2
  • 如何将 pg_dump 与连接 uri / url 一起使用?

    我可以调用psql像这样 psql postgres 我该如何使用pg dump带有以下格式的连接字符串postgres 比将 URI 分解为主机 帖子 用户名 密码更方便 有这方面的语法吗 pg dump postgres usernam
  • MySQL 无法在 AMPPS OS X 上启动

    我在使用 AMPPS 启动 mysql 时遇到问题 我正在使用 OS X Mavericks 和最新版本的 Ampps 在小系统崩溃并重新启动后 我无法启动 mysql mysql 错误 2014 01 22 18 12 41 398 No
  • C# 获取机器IP地址的方法

    如何在 C 中获取机器的 IP 地址 IPAddress localIPs Dns GetHostAddresses Dns GetHostName 您的计算机没有单个 IP 地址 并且某些返回的地址可能是 IPv6 MSDN 链接 Dns
  • 获取视频上传的确切时间

    我正在使用Youtube API http gdata python client googlecode com svn trunk pydocs gdata html使用关键字查询进行搜索 import gdata youtube imp
  • ASP.NET MVC3 - “对象引用未设置到对象的实例”错误

    我对 NET 和 MVC3 比较陌生 尝试添加对象的实例时 我遇到了上述错误消息的问题 下面是我的代码 关键日期类 public class KeyDate Key public int KeyID get set StringLength
  • 如何将我的解决方案纳入 Windows 问题报告和解决方案

    Windows Vista 添加了问题报告和解决方案功能 用于记录软件问题 将其报告给 Microsoft 然后表示他们会收集这些问题的解决方案并提供给用户 因此 当我的程序遇到错误并崩溃时 用户会收到异常报告 source beholdg
  • 单击时不要隐藏 OverlayPanel

    我想做 PrimeFaces覆盖面板 http www primefaces org showcase labs ui overlayPanel jsf即使用户单击工具提示之外的区域也保持可见 关闭工具提示的唯一方法是使用其上的 关闭 按钮
  • Apiary:将 API 导出为 JSON,以生成客户端代码

    我们都知道养蜂场很强大 或者不是 我认为确实如此 我想知道如何才能更进一步允许用户导出 API 的 JSON 描述 因此开发人员可以编写客户端代码生成脚本 这应该有帮助 http ttezel github io blog 2013 02
  • c中的序列点

    命令式编程中的序列点定义了计算机程序执行中的任何点 在该点处保证先前评估的所有副作用都已执行 并且尚未执行后续评估的任何副作用 这是什么意思 有人可以用简单的话解释一下吗 当序列点发生时 基本上意味着您可以保证之前的所有操作都已完成 在没有
  • 启动投射设备的投射会话

    我有这个用例 检测播放设备并保存其 ID 名称和信息 以自动方式连接到预定义设备并开始投射会话 有一些内容 我研究了 Google Cast API v3 看起来真的很难 在 v2 中 这是可能的 因为发送者应用程序控制了 90 的进程 即
  • 用于压缩连续正整数的 C 库

    我有一个非常常见的问题 即为磁盘中的字符串数组创建索引 简而言之 我需要将每个字符串的位置存储在磁盘内表示中 例如 一个非常简单的解决方案是索引数组 如下所示 uint64 idx 0 20 500 1024 103434 这表示第一个字符
  • 为 Python 函数参数提供额外装饰/元数据的好方法是什么?

    我们正在考虑使用 Python IronPython 但我认为这不相关 为另一个控制设备的应用程序提供某种 宏 支持 我们想用 Python 编写相当简单的函数 它需要一些参数 比如时间 温度和位置 不同的函数将采用不同的参数 主应用程序将
  • 如何从 postgresql sql 表中删除重复行

    date window points actual bool previous bool creation time source 2021 02 11 110 0 6 0 0 2021 02 14 09
  • 无法安装 rvest 软件包

    我需要安装 R 版本 3 1 2 的 rvest 包 2014 10 31 我收到这些错误 checking whether the C compiler supports the long long type no stringi can
  • 背景图像在 iPad 和 iPhone 上不显示

    我想在移动网页中创建一个带有背景的部分 因此我使用了以下 CSS 代码 section1 background url background1 png auto 749px height 749px 背景在 Android Chrome F
  • Angular DatePicker - 多个指令 > [datepicker, datepicker]

    我正在尝试使用 720Kb 日期选择器 https github com 720kb angular datepicker https github com 720kb angular datepicker 使用简单的示例时
  • 如何在批处理文件中提及 C:\Program Files

    我需要从批处理文件调用 C Program Files 目录中的 exe 文件 我们如何在批处理文件中提及目录名称 Program Files 我收到类似 C Program not found 的错误 我认为需要在中间添加 或 但无法得到
  • C# 中的文件和文件夹的递归列表[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我编写此代码是为了在 C 中递归列出文件和文件夹 var filesInTheCurrentDirectory System IO Direct