C#使用WIN32API来遍历文件和目录
日期:2008年5月11日 作者: 查看:[大字体 中字体 小字体]-
我们有时需要遍历某个目录下的文件和子目录,可以使用System.IO.DirectoryInfo.GetDirectories或GetFiles来获得目录下的所有的文件和子目录,当这个目录下的内容比较多时,这个操作就比较耗时间,有时我们仅仅需要知道某个目录下是否有子目录,这样的操作显然是浪费时间的。此时我们很容易想到三个Win32API函数 FindFirstFile,FindNextFile和FindClose。这三个API搭配使用就能遍历文件和子目录了,而且可以遍历的时候随时中止,避免无谓的操作。
C#中可以使用foreach来遍历某个序列,遍历使用的对象必须实现 System.Collections.IEnumeable接口,而内部调用的遍历器则必须实现System.Collections.IEnumerator , 为了使用方便,我们在使用FindFirstFile等API函数时封装为 IEnumerator,而且实际上是有条件封装的。
这里很多人就会提到C#调用API的执行效率问题,认为应当用C,C++调用API才是正道,使用C#调用则有些鸡肋。但在我个人编程经历中,也有不少调用API的,经验发现其实效率问题不大,可以省略。我只是做常规的运行在PC机上面的软件,CPU通常超过1GHZ,而且无需考虑高实时性和高效率。若过于考虑效率问题会加大软件开发消耗。从工程开发管理方面看是不合理的。我应当解决比较突出的效率问题,不突出的影响不大的效率问题有时间才去解决。使用C#封装Win32API必然会降低执行效率,但是封装后使用方便快捷,综合考虑认为这是正确的。
这里说一下“技术镀金”这个问题,所谓技术镀金就是开发人员在项目软件开发中过于追求技术的完美性,试图在技术上镀上一层完美的金壳,导致软件开发工作量加大,项目时间拉长,有可能导致项目的失败。我吃过“技术镀金”的苦头,现在我内心是追求完美的,但实际开发时经常有意压制追求完美的心思。
现在继续探讨封装大计,本次封装重点在于实现IEnumerator,而IEnumeable只是IEnumerator的一个包装。IEnumerator实现方法 Reset , MoveNext 和属性 Current,Reset方法用于重新设置遍历器,MoveNext用于查找下一个文件或目录,而Current返回当前文件或目录。
这个遍历器还得注意FindClose的调用,必须在遍历完毕没有找到文件或子目录后调用,若不调用该API函数则会造成内存泄漏。
根据上述设计,我写出如下代码,这段代码功能单一,希望有人能用得上
/// <summary>
/// 文件或目录遍历器,本类型为 FileDirectoryEnumerator 的一个包装
/// </summary>
/// <remarks>
///
/// 编写 袁永福 ( http://www.xdesigner.cn )2006-12-8
///
/// 以下代码演示使用这个文件目录遍历器
///
/// FileDirectoryEnumerable e = new FileDirectoryEnumerable();
/// e.SearchPath = @"c:\";
/// e.ReturnStringType = true ;
/// e.SearchPattern = "*.exe";
/// e.SearchDirectory = false ;
/// e.SearchFile = true;
/// foreach (object name in e)
/// {
/// System.Console.WriteLine(name);
/// }
/// System.Console.ReadLine();
/// - [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] 下一页
-
- C#使用WIN32API来遍历文件和目录 相关文章:
- ·解读防火墙日志记录 防范网络攻击
- ·QQ常在异地登录的原因及其应对方法
- ·cn域名收录实验小结
- ·用木马取得远程电脑上QQ聊天纪录
- ·微软问答录 到底WHS是干啥的?
- ·Windows Vista系统中如何做到安全刻录
- ·SATA串口硬盘Vista系统驱动安装实录
- ·加密视频光盘轻松刻录教你做
- ·PHP中删除目录的三种方法
- ·将DVD刻录盘变成移动硬盘
- C#使用WIN32API来遍历文件和目录 相关软件
- ·《冰封王座》录像::mouz.GeIL.KnOfF Vs fnatic.Satiini{Echo Isles}
- ·《冰封王座》录像:TargA Vs 4K.Creolophus{Gnoll Wood}
- ·《反恐精英》uyr精彩主视角录像
- ·《反恐精英》JAEGARN精彩主视角录像
- ·《反恐精英》录像:aTTaX vs GoodGame
- ·《星际争霸》录像:MYM.Sen vs sMi.Stalife
- ·《星际争霸》录像:iFeng vs IdrA
- ·《反恐精英》NoA.ave精彩主视角录像
- ·《冰封王座》录像:fnatic.Satiini Vs wNv.SoCcEr{Turtle Rock}
- ·《星际争霸》录像:Nal_keke vs DkH.Ghost
- 特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作
- 者.文章版权归文章原始作者所有.对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转
- 载的文章有版权问题请联系编辑人员,我们尽快予以更正. 转载请注明来源:http://www.hackhome.com
上一篇:CSS的常用技巧放送
下一篇:手写分页函数C#
精品推荐
热点TOP10
- ·socket编程原理
- ·Beej的网络socket编程指南
- ·将程序从托管扩展 C++ 迁移到 C++/CLI(1)
- ·飞机订票系统设计
- ·用c#监控网络流量
- ·具体而微的绘图程式-c++ Borland 入门
- ·C语言库函数 (D类字母)
- ·编写自己的缓冲区溢出利用程序
- ·CRichEditCtrl实现MSN/QQ动画表情
- ·C#使用WIN32API来遍历文件和目录
- ·使用 C# 编程对 RTF 文档进行操作
- ·学生成绩管理系统实习
- ·corba核心规范
- ·再现C#导出Excel源码
- ·C/C++笔试、面试题目大汇总
- ·VC++动态链接库编程之MFC扩展 DLL
- ·C语言库函数(S类字母) - 3
- ·使用C#来开发.NET CF 蓝牙通信模块
- ·支付宝Payto接口的C#.net实现方法
- ·TCPIP完整的一套基础介绍
特别推荐
- ·Beej的网络socket编程指南
- ·socket编程原理
- ·C语言库函数 (D类字母)
- ·C#程序开发中的常用函数汇总
- ·C#数据库操作的三种经典用法
- ·C/C++笔试、面试题目大汇总
- ·C语言的常用库函数使用方法分析及用途
- ·在C语言中如何处理时间和日期
- ·C++设计模式之Singleton
- ·VC++动态链接库编程之MFC扩展 DLL
- ·TCP/IP网络重复型服务器通信软件的设计
- ·DirectX游戏开发入门
- ·经典与现代的结合:在MFC中集成RAD .NET框架
- ·Windows API-GDI入门基础知识详解(2)
- ·Visual C++ 入门精解
- ·C#基础概念二十五问
- ·用C#实现pdf文件的完整性验证
- ·成为嵌入式程序员应知道的0x10个问题
- ·TCP/IP编程实现远程文件传输
- ·几个C#编程的小技巧
