windows下的文件遍历(使用CFindFile)
这个我一直都很想做了,前两天开始准备,查找了一下CFindFile的资料,然后把思路理清楚,就直接开始做了。
文件系统是一个操作系统以一部分,所以想文件操作,基本上就要依赖于操作系统提供的接口函数。
在这我是直接用windows中对文件查找专门做好了的一个类来实现文件的遍历。
其实一个文件目录就是一个树,每一层目录都有很多的子目录和文件,当成节点就好了。
在使用CFindFile遍历的时候,需要先调用FindFile函数,再调用FindNextFile函数来遍历当前这一级的目录。
我为了输出方便使用了控制台工程,在这里需要提示一点:
由于windows程序设计中默认使用unicode编码,所以在使用控制台程序输出的时候,需要使用wcout来进行输出。
而使用wcout进行输出的时候,如果遇到了汉字,则会导致程序卡住,然后停止运行的情况。
解决方法是添加下面的函数调用:
setlocale(LC_ALL, "chs");
这个函数是我在网上查到的,我遇到这个问题就是因为在遍历C盘目录的时候由于汉字的出现卡死,发现一个文件名只输出了前面的数字和英文部分,而汉字没输出。
先展示下我做的成果:

最后运行结束:

效果还可以吧?所有的目录应该都列出来了。
下面看一下函数:
void TraversFile(CString csPath)
{
CString csPrePath = csPath;
CString csNextPath = csPath;
CFileFind ff;
csPath += _T("*.*");//遍历这一级全部的目录
int nResult = ff.FindFile(csPath);
while(nResult)
{
nResult = ff.FindNextFileW();
if(ff.IsDirectory() && !ff.IsDots())
{
wcout << (LPCTSTR)ff.GetFilePath() << endl;
csNextPath += ff.GetFileName();
csNextPath += _T("\\");
TraversFile(csNextPath);
}
csNextPath = csPrePath;
}
}
这里主要采用的方法是递归调用,我觉得这种方式相对较简单,且代码段比较少可以看到,这个函数一共才20行,而且层次很清晰。
我觉得主要需要讲的就是那个if判断,因为在那块是需要注意的两个地方。
IsDirectory函数用来判断当前选中的这个文件是一个文件还是一个目录。所谓目录,其实就是文件夹啦~
如果是文件夹的话,就输出路径,然后整合文件夹的路径,传给递归调用函数,来遍历当前这个文件夹下的文件。
最开始这个这个函数的参数是某个子目录,比如我遍历的F盘,传入的参数就是:F:\\
传入这个参数之后,会在其后面添加*.*,FindFile函数在这个时候就开始查找当前目录的全部的文件和文件夹了。
基本上啊,就是一个树的深度优先遍历。
主函数的代码非常简单,但是能很好的完成功能:
using namespace std;
/*修改于20130625 做文件查找*/
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
setlocale(LC_ALL, "chs");
CString cs = _T("F:\\");
TraversFile(cs);
system("pause");
return ;
}
还不错吧?
windows下的文件遍历(使用CFindFile)的更多相关文章
- Windows下对文件夹下所有图片批量重命名(附C++,python,matlab代码)
https://blog.csdn.net/u011574296/article/details/72956446: Windows下对文件夹下所有图片批量重命名(附C++,python,matlab ...
- 关于Windows下的文件后缀名问题
一.背景说明 有很多的小伙伴对windows下的文件后缀名不能很好地理解作用和区别,更不用说高深的使用了,在这里给大家说一下这些文件后缀名到底有什么区别,有什么作用呢? 二.说明 简单的说来,wind ...
- 将Windows下的文件同步到Linux下
需求:把Windows下的某些文件自动传送到Linux指定目录下 实现: 1. Windows下安装 WinSCP工具,并把Liunx服务器信息保存 2. 编写脚本,实现双击工具就把Windows下的 ...
- windows下在文件夹中快速启动cmd
在windows下,有时候由于特定需要,我们经常需要将cmd cd到某文件下进行命令行操作,其实,这里有一个小技巧: 在一个文件下,按住shift键,然后点击鼠标右键,你就会发现菜单栏中多出一个“在 ...
- linux或者windows下的文件拷贝
# 上代码 #!/usr/bin/env python # -*- coding:utf-8 -*- import os import shutil import tarfile base_dir ...
- windows下计算文件的md和sha值
在windows下可以使用FCIV命令行工具计算文件的md5和sha值,具体例子如下: FCIV -md5 -sha1 path\filename.ext 例如: FCIV-md5-sha1 c:\w ...
- windows下建立文件的换行符^M导致linux下的shell脚本执行错误的解决方式
常常在windows下编辑的文件远程传送到linux下的时候每行末尾都会出现^M.这将导致shell脚本执行错误,主要是由于dos下的编辑器和linux下的编辑器对文件末行的回车符处理不一致导致. 主 ...
- Windows下切分文件(GnuWin32)
windows下碰到查看大日志文件还真麻烦,今天找了个工具来做这个:安装GnuWin32,然后用里面的split命令分割日志文件 ps:发现intellij idea还挺好,超过2g的日志文件也能进行 ...
- windows下数据库文件使用脚本同步到linux下的mysql数据库中
1.背景 windows server 2008 下 每天会有 *.sql数据文件 需要上传到linux 中的mysql数据库中 而运维人员是在 windows server 下使用 xshell 连 ...
随机推荐
- UIKit 框架之UISearchController
// // tableViewController.m // searchController // // Created by City--Online on 15/6/1. // Copyrigh ...
- 关于Web服务器域名设置相关知识积累
1.第一个问题,如何将一个服务器映射到一个域名上呢? 在申请域名的时候,会配置服务器IP和域名的对应关系,所以如果系统中只有一个应用的情况下,应用服务器不需要做任何配置. 2.在Tomcat服务 ...
- shiro添加注解@RequiresPermissions不起作用
这是因为没有开启spring拦截器,在spring-mvc.xml中加入以下代码就可以了(一定要写在最先加载的xml中,写在后面加载的xml中也不起作用) <bean class="o ...
- asp.net中实现群发邮件功能
前段时间在帮老师开发的网站中需要用到一个群发邮件的功能,而自己之前学习cms系统的时候用的we7的群发邮件功能也有一些问题,于是乎便自己去网上查了一下资料,自己总结了一下,并且封装成了一个类,亲测有用 ...
- 说说Thread.Sleep(0)的那些奇怪的事
写在前面 最近在弄一个传输组件,用到很多多线程的知识,其中有个问题,困扰我很久,不知道是什么原因,脑子一热,在传输过程中,添加了一句代码Thread.Sleep(0).那个问题竟然解决了,耗费我一上午 ...
- KMP--路过
HDU 1358:弄清楚了NEXT,就好解决,还有不要再循环中用strlen;会超 ----------------------我是凑字数的------------------还是不会KMP----- ...
- HDOJ 1062 Text Reverse
Text Reverse Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- POC
大概就是原型验证的意思 验证概念 编辑 概念验证(Proof of concept,简称POC)是对某些想法的一个不完整的实现,以证明其可行性,示范其原理,其目的是为了验证一些概念或理论.在计算机安全 ...
- Javascript与Flash通信全解析
原文:https://www.imququ.com/post/39.html Flash已经提供了ExternalInterface接口与JavaScript通信,ExternalInterface有 ...
- 算术编码Arithmetic Coding-高质量代码实现详解
关于算术编码的具体讲解我不多细说,本文按照下述三个部分构成. 两个例子分别说明怎么用算数编码进行编码以及解码(来源:ARITHMETIC CODING FOR DATA COIUPRESSION): ...