在一边学习VC++一边进行开发的过程中遇到了这样的需求:通过程序读出一张光盘中所有的指定扩展名的文件,并且以列表的形式显示在程序界面中。若只是查找某一目录下的指定文件还好处理,直接用CFileFind类就可以,但如果遍历该目录下、甚至整个盘符下所有的文件及文件夹就会受限制了。这里我们可以用递归的思想写一个简单函数来实现。
函数中当然需要继续使用CFileFind类,首先将文件扩展名及搜索的范围通过形参传递给函数,然后通过处理文件名字符串筛选出符合扩展名要求的文件,并将其文件名以及路径分别保存在两个全局变量中,以便输出;当遍历过程中遇到文件夹时就递归调用本函数,直至遍历完指定目录范围内的所有文件。
具体的函数可以这样写:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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++学习中的童鞋能有帮助~~最近项目上的事情好忙啊,蹭网的机会也不多了,但大家的博客我还是经常去转的,只是留言不多。好了,不解释了,理解万岁!回访去咯~~
很厉害!来学习的。
像一些图片处理程序,默认打开的文件后缀就是图片后缀
@学夫子 @学夫子?恩 这种功能的实现还是比较简单的
这个我是一点都不懂。围观下,你好好学啦。
@朵未 @朵未?俺会拼命学的!
VC++
我是门外汉哈。
@园子 @园子?额 行内人士看起来就会觉得很浅显了
技术篇要顶
看见这么专业的我就只有默默的路过了……
@knife @knife?行内人士看这些东西就会觉得很浅显了