C# 循环访问目录树详解与示例

文章目录

  • 一、目录树遍历的概念
  • 二、使用System.IO命名空间
  • 三、DirectoryInfo和FileInfo类
  • 四、递归遍历目录树
  • 五、示例:列出目录树中的所有文件和文件夹
  • 六、异常处理
  • 七、迭代方法
  • 八、总结

在这里插入图片描述


在C#中,访问文件系统是常见的需求之一。有时我们需要遍历目录树以执行某些操作,例如搜索文件、计算目录大小或执行批量处理。本文将详细介绍如何在C#中循环访问目录树,并提供一个完整的示例。

一、目录树遍历的概念

目录树遍历是一种在文件系统中访问所有目录和文件的过程。它通常从根目录开始,然后递归地访问每个子目录,直到达到树的末端。

二、使用System.IO命名空间

在C#中,System.IO命名空间提供了用于文件和目录操作的类。要使用这些类,你需要在代码顶部添加以下命名空间引用:

using System.IO;

三、DirectoryInfo和FileInfo类

DirectoryInfo类用于表示目录,而FileInfo类用于表示文件。这两个类提供了多种方法来操作文件和目录。

  1. DirectoryInfo:提供创建、移动、删除目录等方法。
  2. FileInfo:提供创建、复制、删除、打开文件等方法。

四、递归遍历目录树

递归是访问目录树的一种常见方法。以下是一个递归函数的基本结构,用于遍历目录:

void TraverseDirectory(DirectoryInfo directory)
{// 处理当前目录下的文件FileInfo[] files = directory.GetFiles();foreach (FileInfo file in files){// 对文件执行操作}// 递归访问子目录DirectoryInfo[] subDirectories = directory.GetDirectories();foreach (DirectoryInfo subDirectory in subDirectories){TraverseDirectory(subDirectory);}
}

五、示例:列出目录树中的所有文件和文件夹

以下是一个完整的示例,该示例列出指定根目录下的所有文件和文件夹:

using System;
using System.IO;class Program
{static void Main(){string rootPath = @"C:\Your\Directory\Path"; // 替换为你的根目录路径DirectoryInfo rootDirectory = new DirectoryInfo(rootPath);if (rootDirectory.Exists){TraverseDirectory(rootDirectory);}else{Console.WriteLine("The specified directory does not exist.");}}static void TraverseDirectory(DirectoryInfo directory){// 处理当前目录下的文件FileInfo[] files = directory.GetFiles();foreach (FileInfo file in files){Console.WriteLine($"File: {file.FullName}");}// 递归访问子目录DirectoryInfo[] subDirectories = directory.GetDirectories();foreach (DirectoryInfo subDirectory in subDirectories){Console.WriteLine($"Directory: {subDirectory.FullName}");TraverseDirectory(subDirectory);}}
}

在运行此程序时,它将打印出指定根目录下的所有文件和文件夹的路径。

六、异常处理

在处理文件和目录时,可能会遇到各种异常,如权限不足、路径不存在等。因此,应该使用try-catch块来处理这些潜在的错误:

try
{TraverseDirectory(rootDirectory);
}
catch (UnauthorizedAccessException)
{Console.WriteLine("Access denied to one or more directories.");
}
catch (DirectoryNotFoundException)
{Console.WriteLine("The specified directory was not found.");
}
catch (Exception e)
{Console.WriteLine($"An unexpected error occurred: {e.Message}");
}

七、迭代方法

迭代方法利用栈(或队列)来模拟递归的行为。使用这种方法时,我们会将要处理的目录放入栈中,然后逐个处理栈中的目录。

下面的示例演示如何不使用递归方式遍历目录树中的文件和文件夹。 此方法使用泛型 Stack 集合类型,此集合类型是一个后进先出 (LIFO) 堆栈。

public class StackBasedIteration
{static void Main(string[] args){// Specify the starting folder on the command line, or in// Visual Studio in the Project > Properties > Debug pane.TraverseTree(args[0]);Console.WriteLine("Press any key");Console.ReadKey();}public static void TraverseTree(string root){// Data structure to hold names of subfolders to be// examined for files.Stack<string> dirs = new Stack<string>(20);if (!System.IO.Directory.Exists(root)){throw new ArgumentException();}dirs.Push(root);while (dirs.Count > 0){string currentDir = dirs.Pop();string[] subDirs;try{subDirs = System.IO.Directory.GetDirectories(currentDir);}// An UnauthorizedAccessException exception will be thrown if we do not have// discovery permission on a folder or file. It may or may not be acceptable// to ignore the exception and continue enumerating the remaining files and// folders. It is also possible (but unlikely) that a DirectoryNotFound exception// will be raised. This will happen if currentDir has been deleted by// another application or thread after our call to Directory.Exists. The// choice of which exceptions to catch depends entirely on the specific task// you are intending to perform and also on how much you know with certainty// about the systems on which this code will run.catch (UnauthorizedAccessException e){Console.WriteLine(e.Message);continue;}catch (System.IO.DirectoryNotFoundException e){Console.WriteLine(e.Message);continue;}string[] files = null;try{files = System.IO.Directory.GetFiles(currentDir);}catch (UnauthorizedAccessException e){Console.WriteLine(e.Message);continue;}catch (System.IO.DirectoryNotFoundException e){Console.WriteLine(e.Message);continue;}// Perform the required action on each file here.// Modify this block to perform your required task.foreach (string file in files){try{// Perform whatever action is required in your scenario.System.IO.FileInfo fi = new System.IO.FileInfo(file);Console.WriteLine("{0}: {1}, {2}", fi.Name, fi.Length, fi.CreationTime);}catch (System.IO.FileNotFoundException e){// If file was deleted by a separate application// or thread since the call to TraverseTree()// then just continue.Console.WriteLine(e.Message);continue;}}// Push the subdirectories onto the stack for traversal.// This could also be done before handing the files.foreach (string str in subDirs)dirs.Push(str);}}
}

通常,检测每个文件夹以确定应用程序是否有权限打开它是一个很费时的过程。 因此,此代码示例只将此部分操作封装在 try/catch 块中。 你可以修改 catch 块,以便在拒绝访问某个文件夹时,可以尝试提升权限,然后再次访问此文件夹。 一般来说,仅捕获可以处理的、不会将应用程序置于未知状态的异常。

如果必须在内存或磁盘上存储目录树的内容,那么最佳选择是仅存储每个文件的 FullName 属性(类型为string )。 然后可以根据需要使用此字符串创建新的 FileInfo 或 DirectoryInfo 对象,或打开需要进行其他处理的任何文件。

八、总结

本文介绍了如何在C#中循环访问目录树。通过使用System.IO命名空间中的DirectoryInfo和FileInfo类,我们可以轻松地递归遍历文件系统。通过一个示例程序,我们展示了如何列出目录树中的所有文件和文件夹。最后,我们还讨论了异常处理的重要性,以确保程序的健壮性。在编写涉及文件系统操作的代码时,这些技巧和概念将非常有用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/52316.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kafak集群搭建-基于zookeeper方式

kafak集群搭建-基于zookeeper方式 1、准备3个kafka2、修改配置文件2.1、修改配置文件 3、启动测试3.1、先启动zookeeper3.2、再启动三台kafka 4、SpringBoot集成kafka集群4.1、项目配置文件application.yml4.2、kafka配置类4.3、启动SpringBoot程序 5、kafka集群架构分析6、查看…

学习能力与研究能力

摘要: 学习就像搭金字塔, 研究就像挖井. 1. 什么是学习 学习 (study) 是获得技能、知识、方法的过程. 学习有两种模式: 一是直接获得前人总结的经验; 二是从数据中总结规律. 2. 什么是研究 研究 (research) 是对已有或新的问题进行探索, 获得新技能、新知识、新方法的过程.…

【kubernetes】相关pod的创建和命令

【书写方法】&#xff1a; 管理使用k8s集群时&#xff0c;创建资源的Yaml文件非常重要&#xff0c;如何快速手写呢&#xff1f; 根据命令提示书写&#xff1a; kubectl explain [资源名称]例如打算写pod资源文件时&#xff0c;可查看如下&#xff1a; # 查看pod下所有字段 …

IO多路复用,select、poll和epoll简介

文章目录 前言1、select2、poll3、epoll4、总结 前言 select、poll 和 epoll 是 Linux 下用于多路复用 I/O&#xff08;Input/Output&#xff09;的系统调用&#xff0c;它们用于监视多个文件描述符&#xff0c;以查看哪个文件描述符上有可读、可写或发生了异常的事件。 1、sel…

python之多线程和多进程以及threading和multiprocessing模块

在 Python 中&#xff0c;多线程和多进程是实现并发编程的两种主要方式。多线程适用于 I/O 密集型任务&#xff0c;而多进程适用于 CPU 密集型任务。Python 提供了 threading 模块用于多线程编程&#xff0c;提供了 multiprocessing 模块用于多进程编程。 多线程 基本用法 使…

深度学习100问9-什么是word2vec模型

Word2vec 模型是一种用于将词语转换为向量表示的工具。 想象一下&#xff0c;我们有很多很多的词语&#xff0c;就像一个个不同的小盒子。Word2vec 模型的作用就是给每个小盒子都找到一个对应的位置&#xff0c;这个位置用一个向量来表示。这样&#xff0c;意思相近的词语在这…

Google Colab快速使用

Google Colab快速使用 1. 引言2. Jupyter笔记本的创建3. 上传代码和数据集4. Colab常规指令 1. 引言 Google Colab是谷歌提供的免费Jupyter&#xff0c;很类似于Linux系统这些在终端界面操纵的感觉&#xff0c;不需要深度学习环境配置就可以使用&#xff0c;完全基于云端运行。…

Shell输出、重定向与管道符

Shell输出、重定向与管道符 1、Shell输出1.1、标准输入输出1.2、echo指令1.3、print与printf指令 2、Shell重定向3、Shell管道符 由于Shell脚本批处理的特殊性&#xff0c;其大部分操作过程位于后台&#xff0c;不需要用户进行干预&#xff0c;因此&#xff0c;使用重定向和管道…

在Windows Server 2012 R2上安装.NET Framework 3.5

在Windows Server 2012 R2上安装.NET Framework 3.5&#xff0c;可以按照以下步骤进行&#xff1a; 打开服务器管理器&#xff1a; 首先&#xff0c;登录到Windows Server 2012 R2的服务器。然后&#xff0c;打开“服务器管理器”。添加角色和功能&#xff1a; 在“服务器管理…

react面试题五

一、请解释React中的高阶组件&#xff08;HOC&#xff09;和Hooks。 在React中&#xff0c;高阶组件&#xff08;High-Order Components, HOCs&#xff09;和Hooks是两种强大的特性&#xff0c;它们用于重用组件逻辑。尽管它们的目的相似&#xff0c;但它们在实现和使用方式上有…

使用Python恢复Windows、Linux、MacOS回收站中的文件和目录

一、使用Python恢复Windows回收站中的文件和目录 import os import platformdef put_back_trash():# 获取操作系统类型os_type platform.system()if os_type "Windows": # Windowsfrom winshell import recycle_binfor item in recycle_bin():winshell.undelete(…

针对防火墙IPSec业务不通或业务丢包问题,防火墙如何做流量统计、远程抓包、报文示踪

问题描述 针对防火墙IPSec业务不通或业务丢包问题&#xff0c;防火墙如何做流量统计、远程抓包、报文示踪 解决方案 1&#xff09;配置流统和远程抓包用的ACL&#xff1b; system [sysname] acl 3555 [sysname-acl-adv-3555] rule permit icmp source 10.82.100.215 0 destin…

结构型模式之代理模式

一、概述 1、代理模式&#xff1a;给某一个对象提供一个代理或占位符&#xff0c;并由代理对象来控制对原对象的访问。 2、代理对象在客户端和目标对象之间起到中介作用 3、引入一个新的代理对象&#xff0c;代理模式的主要目的是在不改变原始对象接口的前提下&#xff0c;增…

DORIS学习网址

DORIS学习网址 序号学习网址备注1ApacheDoris系列&#xff5c;Bucket(分桶)数量设置和自动分桶-CSDN博客自动分桶2Apache Doris 入门教程23&#xff1a;自动分桶和Broker概念介绍_doris broker-CSDN博客新版自动分桶说明3一文教你玩转 Apache Doris 分区分桶新功能&#xff5c;…

Spring 中AbstractRefreshableWebApplicationContext

AbstractRefreshableWebApplicationContext 是 Spring Framework 中用于 Web 应用程序的一个抽象类&#xff0c;位于 org.springframework.web.context.support 包中。它继承自 AbstractRefreshableApplicationContext&#xff0c;主要用于支持 Web 应用程序的上下文管理。 主…

[C语言]一、C语言基础(函数)

G:\Cpp\C语言精讲 6. 函数 6.1函数的基本使用 6.1.1 为什么需要函数 《街霸》游戏中&#xff0c;每次人物出拳、出脚或跳跃等动作都需要编写50-80行的代码&#xff0c;在每次出拳、出脚或跳跃的地方都需要重复地编写这50-80行代码&#xff0c;这样程序会变得很臃肿&#xff…

C++基础面试题 | C和C++的区别?

人生如逆旅&#xff0c;我亦是行人。 - 《临江仙送钱穆父》(苏轼) 2024.8.23 回答重点&#xff1a;C可以认为是C语言的超集&#xff0c;绝大部分C语言代码可以使用C运行 在设计思想上&#xff1a;面向过程 vs 面向对象 C是一种面向过程的编程语言&#xff0c;它侧重于函数和过程…

python学习8-数据获取与整理4

pandas迭代 在 Pandas 中&#xff0c;通常情况下你不需要迭代&#xff08;遍历&#xff09;DataFrame 或 Series&#xff0c;因为很多操作都是矢量化的&#xff0c;可以直接应用于整个数据集。然而&#xff0c;有时候你可能需要遍历数据帧&#xff08;DataFrame&#xff09;或…

通过Python绘制不同数据类型适合的可视化图表

在数据可视化中&#xff0c;对于描述数值变量与数值变量之间的关系常见的有散点图和热力图&#xff0c;以及描述数值变量与分类变量之间的关系常见的有条形图&#xff0c;饼图和折线图&#xff0c;可以通过使用Python的matplotlib和seaborn库来绘制图表进行可视化表达&#xff…

如何使用ssm实现ssm框架的购物网站+vue

TOC ssm113ssm框架的购物网站vue 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规范化管理。…