使用来遍历文件和目录物业

输送设备2021年09月06日

我们有时需要遍历某个目录下的文件和子目录,可以使用tDirectories或GetFiles来获得目录下的所有的文件和子目录,当这个目录下的内容比较多时,这个操作就比较耗时间,有时我们仅仅需要知道某个目录下是否有子目录,这样的操作显然是浪费时间的。此时我们很容易想到三个Win32API函数 FindFirstFile,FindNextFile和FindClose。这三个API搭配使用就能遍历文件和子目录了,而且可以遍历的时候随时中止,避免无谓的操作。

C#中可以使用foreach来遍历某个序列,遍历使用的对象必须实现 numeable接口,而内部调用的遍历器则必须实现numerator , 为了使用方便,我们在使用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

///

/// 编写 袁永福 ( )

///

/// 以下代码演示使用这个文件目录遍历器

///

/// FileDirectoryEnumerable e = new FileDirectoryEnumerable();

/// archPath = @\"c:\\\";

/// turnStringType = true ;

/// archPattern = \"*.exe\";

/// archDirectory = false ;

/// archFile = true;

/// foreach (object name in e)

/// {

/// iteLine(name);

/// }

/// adLine();

///

////remarks

public class FileDirectoryEnumerable : numerable

{

private bool bolReturnStringType = true;

/// summary

/// 是否以字符串方式返回查询结果,若返回true则当前对象返回为字符串,

/// 否则返回 leInfo或rectoryInfo类型

/// /summary

public bool ReturnStringType

{

get { return bolReturnStringType; }

set { bolReturnStringType = value; }

}

private string strSearchPattern = \"*\";

/// summary

/// 文件或目录名的通配符

/// /summary

public string SearchPattern

{

get { return strSearchPattern; }

set { strSearchPattern = value; }

}

private string strSearchPath = null;

/// summary

/// 搜索路径,必须为绝对路径

/// /summary

public string SearchPath

{

get { return strSearchPath; }

set { strSearchPath = value; }

}

private bool bolSearchForFile = true;

/// summary

/// 是否查找文件

/// /summary

public bool SearchForFile

{

get { return bolSearchForFile; }

set { bolSearchForFile = value; }

}

private bool bolSearchForDirectory = true;

/// summary

/// 是否查找子目录

/// /summary

public bool SearchForDirectory

{

get { return bolSearchForDirectory; }

set { bolSearchForDirectory = value; }

}

private bool bolThrowIOException = true;

/// summary

/// 发生IO错误时是否抛出异常

/// /summary

public bool ThrowIOException

{

get { return lThrowIOException; }

set { lThrowIOException = value; }

}

/// summary

/// 返回内置的文件和目录遍历器

/// /summary

/// returns遍历器对象/returns

public numerator GetEnumerator()

{

FileDirectoryEnumerator e = new FileDirectoryEnumerator();

turnStringType = lReturnStringType;

archForDirectory = lSearchForDirectory;

archForFile = lSearchForFile;

archPath = rSearchPath;

archPattern = rSearchPattern;

主要是每一个副本都要打很多波的怪物 rowIOException = lThrowIOException;

d(e);

return e;

}

/// summary

/// 关闭对象

/// /summary

public void Close()

{

foreach (FileDirectoryEnumerator e in myList)

{

ose();

}

ear();

}

查看本文来源

杭州宫颈糜烂哪家好
福州白癜风哪好
柳州治疗阳痿的医院是哪家
相关阅读
小圆脸有多显胖?当谭松韵与baby同框,看清脸部照,让人不敢信

小圆脸有多显胖?当谭松韵与baby同框,注意到身躯照,让人劝信 昨日,由谭...

2024-09-05
评论丨启功书法赝品印上北大学生证,一个尴尬的隐喻

批评家丨德馨鉴赏真品标明清华会员卡,一个惊愕的意涵 清华的这本会员...

2024-07-27
职场情商讲义:简朴的哲学,练就由内而外的平衡性

本文看点:自觉情商,不只是彰显在交谈上,不只起到于人和人之间的的关系...

2024-06-29
最新应于!延期!

2022年看护执业资格笔试和环境卫生管理学技术资格笔试延期至7年底23日、24日...

2024-06-23
60岁叶倩文穿深V蕾丝风景秀丽背!头发花白皱纹明显,表情搞怪做鬼脸

昨日,有留言在社交平台上晒显露叶倩文开拍片段的特写,不见60岁的叶倩文...

2024-05-05
为什么有人月薪几千,还能每天额头万的新包?

我,一个普一般来说通的打工人 没有年薪几十万,家庭先决条件也一般来说...

2024-02-23
友情链接