遍历文件系统目录树的深入理解
发布时间: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);
}
}
}


猜你喜欢
- 前言我们知道在Android开发中不能在非ui线程中更新ui,但是,有的时候我们需要在代码中执行一些诸如访问网络、查询数据库等耗时操作,为了
- 安卓和苹果的客户端开发中,经常会使用到webview,我们一般做法是将webview加入到native页面中。当我们对页面进行销毁的时候,其
- 在 Java SE 6 所提供的诸多新特性和改进中,值得一提的是为 Java 程序提供数据库访问机制的 JDBC 版本升级到了 4.0, 这
- 里氏替换原则(LSP)定义:在任何父类出现的地方都可以用它的子类类替换,且不影响功能。解释说明:其实LSP是对开闭原则的一个扩展,在OO思想
- 本文实例讲述了C#获取汉字字符串拼音首字母的方法。分享给大家供大家参考。具体如下:这个C#类经常能够用到,将提取汉字的拼音首字母,方便用户查
- 查了网上的资料,有比较全面的,但有一个问题就是容易出现一个文字和框子不符合的现象。(仔细看,蓝色字母和背景的灰色有空白)要消除这个空白,很简
- 在传统的单服务架构中,一般来说,只有一个服务器,那么不存在 Session共享问题,但是在分布式/集群项目中,Session 共享则是一个必
- 昨天弄了一天的Android Studio svn,感觉没有eclipse的svn好装,中间遇到很多的麻烦问题。这里来记录下吧下载下来的时候
- spring的事务控制本质上是通过aop实现的。在springboot中使用时,可以通过注解@Transactional进行类或者方法级别的
- 本文介绍了详解WMI RPC 服务器不可用的解决方案,分享给大家,具体如下:ConnectionOptions connectionOpti
- 本文实例讲述了Android编程实现XML解析与保存的三种方法。分享给大家供大家参考,具体如下:简介在Android开发中,关于XML解析有
- 1.问题描述使用post方法调用上级联网厂家接口,返回http状态码415,返回信息Content type ‘appl
- 前言扫雷是一个常见小游戏,那么如何用C语言实现扫雷呢?学习了二维数组之后,我们可将扫雷的网格区域存储为二维数组,从而使用C语言实现扫雷。1.
- 1、相差秒public double DiffSeconds(DateTime startTime,DateTime endTime){ &
- 第一次是接触Lambda表达式是在TypeScript中(JavaScript的超集中),当时是为了让TypeScript的this方法外而
- preHandle: 预先处理,在目标的controller方法执行之前,进行处理postHandle: 在目标的con
- 1、使用FileStream读写文件 文件头:using System;using System.Collections.Gene
- 需求:学生输入姓名和语文、数学、英语,编程求出总分和平均分,并在屏幕上显示XX的总分和平均分using System;using Syste
- 本文实例讲述了Java泛型的使用限制。分享给大家供大家参考,具体如下:一 什么情况下不能使用泛型1 不能使用泛型的形参创建对象。T o=ne
- 1、引例class Complex{private: double Real,Image;public: &nbs