遍历文件系统目录树的深入理解
时间:2022-09-15 20:03:46
在c#中可以遍历指定驱动器或指定目录下嵌套目录中的所有文件或者任意深度的文件。通过遍历可以检索string形式的目录名和文件名,也可以检索 System.IO.FileInfo 或 System.IO.DirectoryInfo 对象形式的其他信息。可以通过递归遍历和堆栈遍历两种方式实现目录遍历。
递归遍历
递归算法简单,但嵌套树太深,可能会引起堆栈溢出异常。
/// <summary>
/// 通过递归方式访问目录树
/// </summary>
class RecursiveAccessDirectory
{
//声明并实例化一个字符串集合
static System.Collections.Specialized.StringCollection log
= new System.Collections.Specialized.StringCollection();
static void Main()
{
/*该部门代码循环访问本机所有驱动器上的文件
*
*
//返回计算机逻辑驱动器名称的字符串数组
//包括光驱及连接计算机的移动驱动器
string[] drives = System.Environment.GetLogicalDrives();
foreach (string dr in drives)
{
System.IO.DriveInfo di = new System.IO.DriveInfo(dr);
if (!di.IsReady)
{
Console.WriteLine("驱动器 {0} 不能读出", di.Name);
continue;
}
System.IO.DirectoryInfo rootDir = di.RootDirectory;
WalkDirectoryTree(rootDir);
}
*/
/*循环访问指定目录下的文件夹
*
*/
System.IO.DirectoryInfo rootDir = new System.IO.DirectoryInfo(@"C:\test");
WalkDirectoryTree(rootDir);
Console.WriteLine("限制用户访问文件:");
foreach (string s in log)
{
Console.WriteLine(s);
}
Console.Read();
}
static void WalkDirectoryTree(System.IO.DirectoryInfo root)
{
System.IO.FileInfo[] files = null;
System.IO.DirectoryInfo[] subDirs = null;
try
{
//GetFiles方法的参数可以包含通配符。
//即使目录下没有匹配的文件,返回长度为0不为空的数组对象,
//所以递归函数可以放在if (files != null)里。
//下面为查找所有有后缀名的文件。
files = root.GetFiles("*.*");
}
//请求权限超过应用程序提供权限抛出异常
catch (System.UnauthorizedAccessException e)
{
//在访问某个文件夹遭受拒绝时,
//您可以提升自己的权限,然后再次访问它。
log.Add(e.Message);
}
catch (System.IO.DirectoryNotFoundException e)
{
Console.WriteLine(e.Message);
}
if (files != null)
{
foreach (System.IO.FileInfo fi in files)
{
Console.WriteLine("{0}: {1} {2}", fi.FullName, fi.Length, fi.CreationTime);
}
subDirs = root.GetDirectories();
foreach (System.IO.DirectoryInfo dirInfo in subDirs)
{
WalkDirectoryTree(dirInfo);
}
}
}
}
堆栈遍历
利用泛型 Stack<T> 集合类型实现,该类型是一个后进先出 (LIFO) 堆栈。
/// <summary>
/// 通过堆栈方式访问目录树
/// </summary>
class StackAccessDirectory
{
static void Main()
{
TraverseTree(@"C:\test");
Console.Read();
}
public static void TraverseTree(string root)
{
Stack<string> dirs = new Stack<string>(20);
if (!System.IO.Directory.Exists(root))
{
throw new ArgumentException();
}
dirs.Push(root);
while (dirs.Count > 0)
{
string currDir = dirs.Pop();
string[] subDirs;
try
{
subDirs = System.IO.Directory.GetDirectories(currDir);
}
catch (System.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(currDir);
}
catch(System.UnauthorizedAccessException e)
{
Console.WriteLine(e.Message);
continue;
}
catch(System.IO.DirectoryNotFoundException e)
{
Console.WriteLine(e.Message);
continue;
}
foreach (string file in files)
{
try
{
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)
{
Console.WriteLine(e.Message);
continue;
}
}
foreach (string str in subDirs)
dirs.Push(str);
}
}
}
标签:遍历文件系统
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
详解Android获取设备唯一ID的几种方式
2022-07-15 12:33:41
基于c# Task自己动手写个异步IO函数
2021-08-06 12:07:56
![](https://img.aspxhome.com/file/2023/4/108664_0s.png)
Java实现年兽大作战游戏详解
2023-11-08 04:28:05
![](https://img.aspxhome.com/file/2023/5/58875_0s.jpg)
Mybatis的mapper.xml中if标签test判断的用法说明
2023-12-23 23:04:16
c#字符串编码问题的处理解决
2021-07-06 13:47:49
![](https://img.aspxhome.com/file/2023/7/88407_0s.jpg)
Android中监听未接来电的2种方法
2023-11-02 10:44:48
C#设计模式之适配器模式与装饰器模式的实现
2021-10-30 02:54:32
![](https://img.aspxhome.com/file/2023/8/108718_0s.png)
MyBatis实现模糊查询的几种方式
2023-06-03 17:31:43
![](https://img.aspxhome.com/file/2023/9/92699_0s.png)
基于Spring p标签和c标签注入方式
2023-11-25 22:26:36
![](https://img.aspxhome.com/file/2023/7/109947_0s.png)
Spring-Data-JPA整合MySQL和配置的方法
2023-10-29 10:19:41
![](https://img.aspxhome.com/file/2023/4/58734_0s.png)
Spring Cloud 系列之服务调用 OpenFeign的实现
2023-10-20 07:34:00
![](https://img.aspxhome.com/file/2023/9/77359_0s.png)
WinForm实现为TextBox设置水印文字功能
2023-06-09 21:15:38
![](https://img.aspxhome.com/file/2023/3/85693_0s.png)
完美解决android M上锁屏情况下,禁止pc通过MTP访问手机存储单元
2023-01-23 07:55:37
剖析Spring WebFlux反应式编程设计及工作原理
2023-06-10 20:01:13
![](https://img.aspxhome.com/file/2023/2/115902_0s.png)
Android Glide的简单使用
2022-12-22 01:37:14
解决pageHelper分页失效以及如何配置问题
2022-03-15 06:45:44
Android 中SwipeRefreshLayout与ViewPager滑动事件冲突解决方法
2023-02-26 21:34:17
Android加载loading对话框的功能及实例代码(不退出沉浸式效果)
2023-05-14 01:25:33
![](https://img.aspxhome.com/file/2023/3/118923_0s.gif)
C#中的三种定时计时器Timer用法介绍
2023-06-09 13:31:13
![](https://img.aspxhome.com/file/2023/6/111256_0s.jpg)
java8 集合之Stack详解及实例
2023-08-02 16:04:07
![](https://img.aspxhome.com/file/2023/4/82324_0s.jpg)