在一边学习VC++一边进行开发的过程中遇到了这样的需求:通过程序读出一张光盘中所有的指定扩展名的文件,并且以列表的形式显示在程序界面中。若只是查找某一目录下的指定文件还好处理,直接用CFileFind类就可以,但如果遍历该目录下、甚至整个盘符下所有的文件及文件夹就会受限制了。这里我们可以用递归的思想写一个简单函数来实现。
函数中当然需要继续使用CFileFind类,首先将文件扩展名及搜索的范围通过形参传递给函数,然后通过处理文件名字符串筛选出符合扩展名要求的文件,并将其文件名以及路径分别保存在两个全局变量中,以便输出;当遍历过程中遇到文件夹时就递归调用本函数,直至遍历完指定目录范围内的所有文件。
具体的函数可以这样写:
void Search(CString strPath, CString strFileName)
{
if ( strPath.Right( 1 ) != _T( "\\" ) )
strPath += _T( "\\" );
strPath += _T( "*.*" );
CFileFind file;
BOOL bContinue = file.FindFile( strPath );
while ( bContinue ) //遍历所选目录
{
bContinue = file.FindNextFile();
if ( file.IsDirectory() && ! file.IsDots() ) //如果是文件夹,则递归调用本函数
{
Search( file.GetFilePath(), strFileName );
}
else if ( ! file.IsDots() ) //如果是文件,则判断是否满足扩展名要求
{
if ( file.GetFileName().Find( strFileName.Right( 4 ) ) != -1 )
{
info+=file.GetFileName(); //将文件名保存到全局变量
info+=_T("\n"); //以换行符隔开
path+=file.GetFilePath(); //将文件路径保存到全局变量
path+=_T("\n");
}
}
}
}
通过调用这个函数我们就可以实现递归搜索任意目录下的所有指定扩展名的文件了,当然,对于储存文件名称及路径的两个全局字符串变量还需要经过处理才能显示到列表中去,具体处理就涉及到字符串分割了,你可以参考这篇文章——VC++中如何按字符来分割字符串,此处不再赘述。
通过一个小的测试程序我们可以看一下遍历效果:
该实例是在“D:\覆盖区项目”目录下查找所有扩展名为“WP”的MapGIS文件,查找结果显示在列表控件中。我们处理的地学数据一般都是以成千上万个点、线、面文件的形式保存在光盘中,用这种全盘搜索的方式便可以快速将文件信息读入到程序中,省时省力,你还可以扩充到其它的应用当中。
PS:在学习VC++的过程中总结了好多知识点,但发现将这些零散的知识点串起来整理成文章还真要费很大的功夫,只能先捡个人觉得比较有意义的东西写下来了,希望对同处在VC++学习中的童鞋能有帮助~~最近项目上的事情好忙啊,蹭网的机会也不多了,但大家的博客我还是经常去转的,只是留言不多。好了,不解释了,理解万岁!回访去咯~~


不懂编程,纯路过支持一下博主哈,能把自己所学的东西写出来,是一种更系统的总结
@顺水横流 @顺水横流?恩 之前没有写总结的习惯
现在要慢慢养成
@Pavel @Pavel?博主加油,呵呵
不懂变成的奶牛路过~~~ 😎
@奶牛 @奶牛?linux下不都是通过代码实现一些操作吗?
苏姐来看看你了啊 呵呵 😛
又是一个高学问的东东···
@箴言 @箴言?行内人士看起来就会觉得很浅显了
原来更新了,跟之前的标题差不多嘛
@蛋卷 @蛋卷?我喜欢加个醒目的方括号 呵呵 这样标题就看起来差不多了
嗯,关注博主,来学习了!
尊敬的博主,您好!现在有个针对每个wordpress主题的博主有奖博客征文活动!欢迎您报名参加:http://happy.uc55.com/www/bloger/
打扰博主了!
C++还是有点看得懂的
也想学,可惜没时间了!
@小段 @小段?都搞Web开发了还学这个干啥啊?你想当全才?
哈哈 不错啊 我们在学C
@电脑人生 @电脑人生?学好c非常重要的
我现在终于明白这个道理了
@Pavel @Pavel?现在基本忘记了,还得复习下,现在学数据结构,VC打算以后学了,打算开始学linux c了,我们应用是在Linux上!
@阿鼎 @阿鼎?我们是基于windows开发的
其实我更想学linux