一个简单的非递归硬盘文件遍历程序(C#版)
2013-04-03 12:23
411 查看
最近自己在做一个类似于galgame管理器的东西,于是便接触到了硬盘搜索,MS并没有直接给我们去访问搜索的接口,只是在C#中提供了FindFirstFile和FindNextFile让我们去自己构造算法。网上一些比较高效的算法都是采用这个封装的,我自己写的这套非递归文件遍历算法虽然没有那个那么高效吧···不过算是思路简单,随手一写就能用的,而且效率可以接受,采用的是System.IO下的Directory类自带的一些方法。(在我这台机器上该算法扫描7W文件需要15s的时间)
先贴出源代码:
整体思路是找到一层后,如果是文件,则判断文件扩展名是否符合规范,符合则加入;如果是文件夹,则进入该层继续判断,直到扫描完所有文件层。在这里我们采用非递归方式,用list来记录目前层中的文件夹,遇到后不是直接进入而是先加入到list中去,等到这层扫完了后再一点点处理list中的文件夹,直到list为空。
这样我们再通过遍历硬盘盘符对每个盘符调用该算法就做到了遍历硬盘:
先贴出源代码:
public static void getAllDir(string path) { //文件夹栈,用于消除递归 List<string> folders = new List<string>(); if (Directory.Exists(path)) { folders.Add(path);//栈初始化 while (folders.Count > 0) { string[] fileList;//文件列表 //检查该目录是否可以打开,不可以打开直接读取下一个文件夹 try { fileList = Directory.GetFileSystemEntries(path); } catch (System.Exception ex) { if (folders.Count > 0)//读取下一个文件夹 { folders.RemoveAt(0);//移除目录 path = folders[0]; } continue; } folders.RemoveAt(0);//移除目录 foreach (string file in fileList) { if (Directory.Exists(file)) { //遇到文件夹就保存文件名以便日后展开 folders.Add(file); } else { //文件 string fileName = Path.GetFileName("@" + file);//获取文件名 //判断是否有扩展名 if (fileName.LastIndexOf('.') != -1) { string exname = fileName.Substring(fileName.LastIndexOf('.') + 1);//获得扩展名 Match exnameMatch = Regex.Match(exname, "(exe|iso|rar)");//正则匹配扩展名 if (exnameMatch.Success) { ListViewItem lvi = new ListViewItem(); ListViewItem.ListViewSubItem lvsi = new ListViewItem.ListViewSubItem(); //添加第一列(游戏名称) lvi.Text = fileName.Substring(0, fileName.LastIndexOf('.')); lvi.Tag = fileName; //添加第二行(游戏路径) lvsi.Text = Path.GetFullPath(file); lvi.SubItems.Add(lvsi); //添加到表格中 GV.galFileNameGroup.Add(lvi); } } } } if (folders.Count > 0)//读取下一个文件夹 path = folders[0]; } } }
整体思路是找到一层后,如果是文件,则判断文件扩展名是否符合规范,符合则加入;如果是文件夹,则进入该层继续判断,直到扫描完所有文件层。在这里我们采用非递归方式,用list来记录目前层中的文件夹,遇到后不是直接进入而是先加入到list中去,等到这层扫完了后再一点点处理list中的文件夹,直到list为空。
这样我们再通过遍历硬盘盘符对每个盘符调用该算法就做到了遍历硬盘:
public static void Refresh() { //清空内容 GV.galFileNameGroup = new List<ListViewItem>(); //扫描盘符并遍历所有硬盘分区 DriveInfo[] dr = DriveInfo.GetDrives(); foreach (DriveInfo di in dr) { if (di.IsReady) getAllDir(di.ToString()); } }
相关文章推荐
- [每天一个demo]用c#实现简单的上传文件程序
- 【自用】C# 遍历指定文件夹下的文件的一个简单方法
- 自己以前用C#写的简单升级程序源码(比如更新一个安装包或者压缩文件),带进度条,支持续传
- Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作
- C# ArrayList用BinaryFormatter序列化和反序列化进行文件读写的一个简单例子
- 一个简单的统计文件夹下文件或目录的程序
- 自己写的一个C#简单登录程序
- 一个java实现的简单文件下载程序
- 一个简单的 C# 语言编写的 WIN32 程序
- 用C#写一个简单的WINDOWS服务程序
- Java源码——一个简单的应收账款文件合并程序 (Master file update in AR system)-Part2
- [C# 网络编程系列]专题十一:实现一个基于FTP协议的程序——文件上传下载器
- 编写一个程序,一行行地读取输入行,直至到达文件尾。算出每行输入行的长度,然后把最长的那行打印出来。为了简单起见,你可以假定所有的输入行均不超过1000个字符
- C#一个简单下载程序实例(可用于更新)
- 一个简单的点对点文件传输程序
- 一个c#对操作系统文件简单操作的类
- 一个简单的C++加密,解密文件程序
- 一个简单的C#文件日志组件
- 用llvm简单遍历一个bc文件
- 用递归算法实现ASP程序用fso对硬盘上某个路径下目录和文件的遍历