最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
C++ 遍历目录下文件简单实现实例
时间:2022-06-25 04:39:25 编辑:袖梨 来源:一聚教程网
function:遍历目录下所有文件,返回文件总数,子文件夹总数(修改一下可以获得全部文件名等)。
实例代码:
代码如下 | 复制代码 |
#include "stdlib.h" #include "direct.h" #include "string.h" #include "io.h" #include "stdio.h" #include "iostream" usingnamespacestd;
classCBrowseDir { protected: //存放初始目录的绝对路径,以''结尾 charm_szInitDir[_MAX_PATH];
public: //缺省构造器 CBrowseDir();
//设置初始目录为dir,如果返回false,表示目录不可用 boolSetInitDir(constchar*dir);
//开始遍历初始目录及其子目录下由filespec指定类型的文件 //filespec可以使用通配符 * ?,不能包含路径。 //如果返回false,表示遍历过程被用户中止 boolBeginBrowse(constchar*filespec);
protected: //遍历目录dir下由filespec指定的文件 //对于子目录,采用迭代的方法 //如果返回false,表示中止遍历文件 boolBrowseDir(constchar*dir,constchar*filespec);
//函数BrowseDir每找到一个文件,就调用ProcessFile //并把文件名作为参数传递过去 //如果返回false,表示中止遍历文件 //用户可以覆写该函数,加入自己的处理代码 virtualboolProcessFile(constchar*filename);
//函数BrowseDir每进入一个目录,就调用ProcessDir //并把正在处理的目录名及上一级目录名作为参数传递过去 //如果正在处理的是初始目录,则parentdir=NULL //用户可以覆写该函数,加入自己的处理代码 //比如用户可以在这里统计子目录的个数 virtualvoidProcessDir(constchar*currentdir,constchar*parentdir); };
CBrowseDir::CBrowseDir() { //用当前目录初始化m_szInitDir getcwd(m_szInitDir,_MAX_PATH);
//如果目录的最后一个字母不是'',则在最后加上一个'' intlen=strlen(m_szInitDir); if(m_szInitDir[len-1] !='\') strcat(m_szInitDir,"\"); }
boolCBrowseDir::SetInitDir(constchar*dir) { //先把dir转换为绝对路径 if(_fullpath(m_szInitDir,dir,_MAX_PATH) == NULL) returnfalse;
//判断目录是否存在 if(_chdir(m_szInitDir) != 0) returnfalse;
//如果目录的最后一个字母不是'',则在最后加上一个'' intlen=strlen(m_szInitDir); if(m_szInitDir[len-1] !='\') strcat(m_szInitDir,"\");
returntrue; }
boolCBrowseDir::BeginBrowse(constchar*filespec) { ProcessDir(m_szInitDir,NULL); returnBrowseDir(m_szInitDir,filespec); }
boolCBrowseDir::BrowseDir(constchar*dir,constchar*filespec) { _chdir(dir);
//首先查找dir中符合要求的文件 longhFile; _finddata_tfileinfo; if((hFile=_findfirst(filespec,&fileinfo)) != -1) { do { //检查是不是目录 //如果不是,则进行处理 if(!(fileinfo.attrib & _A_SUBDIR)) { charfilename[_MAX_PATH]; strcpy(filename,dir); strcat(filename,fileinfo.name); cout << filename << endl; if(!ProcessFile(filename)) returnfalse; } }while(_findnext(hFile,&fileinfo) == 0); _findclose(hFile); } //查找dir中的子目录 //因为在处理dir中的文件时,派生类的ProcessFile有可能改变了 //当前目录,因此还要重新设置当前目录为dir。 //执行过_findfirst后,可能系统记录下了相关信息,因此改变目录 //对_findnext没有影响。 _chdir(dir); if((hFile=_findfirst("*.*",&fileinfo)) != -1) { do { //检查是不是目录 //如果是,再检查是不是 . 或 .. //如果不是,进行迭代 if((fileinfo.attrib & _A_SUBDIR)) { if(strcmp(fileinfo.name,".") != 0 &&strcmp (fileinfo.name,"..") != 0) { charsubdir[_MAX_PATH]; strcpy(subdir,dir); strcat(subdir,fileinfo.name); strcat(subdir,"\"); ProcessDir(subdir,dir); if(!BrowseDir(subdir,filespec)) returnfalse; } } }while(_findnext(hFile,&fileinfo) == 0); _findclose(hFile); } returntrue; }
boolCBrowseDir::ProcessFile(constchar*filename) { returntrue; }
voidCBrowseDir::ProcessDir(constchar *currentdir,constchar*parentdir) { }
//从CBrowseDir派生出的子类,用来统计目录中的文件及子目录个数 classCStatDir:publicCBrowseDir { protected: intm_nFileCount; //保存文件个数 intm_nSubdirCount;//保存子目录个数
public: //缺省构造器 CStatDir() { //初始化数据成员m_nFileCount和m_nSubdirCount m_nFileCount=m_nSubdirCount=0; }
//返回文件个数 intGetFileCount() { returnm_nFileCount; }
//返回子目录个数 intGetSubdirCount() { //因为进入初始目录时,也会调用函数ProcessDir, //所以减1后才是真正的子目录个数。 returnm_nSubdirCount-1; }
protected: //覆写虚函数ProcessFile,每调用一次,文件个数加1 virtualboolProcessFile(constchar*filename) { m_nFileCount++; returnCBrowseDir::ProcessFile(filename); }
//覆写虚函数ProcessDir,每调用一次,子目录个数加1 virtualvoidProcessDir (constchar*currentdir,constchar*parentdir) { m_nSubdirCount++; CBrowseDir::ProcessDir(currentdir,parentdir); } };
voidmain() { //获取目录名 charbuf[256]; printf("请输入要统计的目录名:"); gets(buf);
//构造类对象 CStatDir statdir;
//设置要遍历的目录 if(!statdir.SetInitDir(buf)) { puts("目录不存在。"); return; }
//开始遍历 statdir.BeginBrowse("*.*"); printf("文件总数: %dn子目录总数:%dn",statdir.GetFileCount(),statdir.GetSubdirCount()); } |
已在windows上验证有效。
下面我加了BeginBrowseFilenames函数,以vector
实例代码:
代码如下 | 复制代码 |
#include "stdlib.h" #include "direct.h" #include "string.h" #include "string" #include "io.h" #include "stdio.h" #include #include "iostream" usingnamespacestd;
classCBrowseDir { protected: //存放初始目录的绝对路径,以''结尾 charm_szInitDir[_MAX_PATH];
public: //缺省构造器 CBrowseDir();
//设置初始目录为dir,如果返回false,表示目录不可用 boolSetInitDir(constchar*dir);
//开始遍历初始目录及其子目录下由filespec指定类型的文件 //filespec可以使用通配符 * ?,不能包含路径。 //如果返回false,表示遍历过程被用户中止 boolBeginBrowse(constchar*filespec); vector
protected: //遍历目录dir下由filespec指定的文件 //对于子目录,采用迭代的方法 //如果返回false,表示中止遍历文件 boolBrowseDir(constchar*dir,constchar*filespec); vector //函数BrowseDir每找到一个文件,就调用ProcessFile //并把文件名作为参数传递过去 //如果返回false,表示中止遍历文件 //用户可以覆写该函数,加入自己的处理代码 virtualboolProcessFile(constchar*filename);
//函数BrowseDir每进入一个目录,就调用ProcessDir //并把正在处理的目录名及上一级目录名作为参数传递过去 //如果正在处理的是初始目录,则parentdir=NULL //用户可以覆写该函数,加入自己的处理代码 //比如用户可以在这里统计子目录的个数 virtualvoidProcessDir(constchar*currentdir,constchar*parentdir); };
CBrowseDir::CBrowseDir() { //用当前目录初始化m_szInitDir getcwd(m_szInitDir,_MAX_PATH);
//如果目录的最后一个字母不是'',则在最后加上一个'' intlen=strlen(m_szInitDir); if(m_szInitDir[len-1] !='\') strcat(m_szInitDir,"\"); }
boolCBrowseDir::SetInitDir(constchar*dir) { //先把dir转换为绝对路径 if(_fullpath(m_szInitDir,dir,_MAX_PATH) == NULL) returnfalse;
//判断目录是否存在 if(_chdir(m_szInitDir) != 0) returnfalse;
//如果目录的最后一个字母不是'',则在最后加上一个'' intlen=strlen(m_szInitDir); if(m_szInitDir[len-1] !='\') strcat(m_szInitDir,"\");
returntrue; }
vector { ProcessDir(m_szInitDir,NULL); returnGetDirFilenames(m_szInitDir,filespec); }
boolCBrowseDir::BeginBrowse(constchar*filespec) { ProcessDir(m_szInitDir,NULL); returnBrowseDir(m_szInitDir,filespec); }
boolCBrowseDir::BrowseDir(constchar*dir,constchar*filespec) { _chdir(dir);
//首先查找dir中符合要求的文件 longhFile; _finddata_tfileinfo; if((hFile=_findfirst(filespec,&fileinfo)) != -1) { do { //检查是不是目录 //如果不是,则进行处理 if(!(fileinfo.attrib & _A_SUBDIR)) { charfilename[_MAX_PATH]; strcpy(filename,dir); strcat(filename,fileinfo.name); cout << filename << endl; if(!ProcessFile(filename)) returnfalse; } }while(_findnext(hFile,&fileinfo) == 0); _findclose(hFile); } //查找dir中的子目录 //因为在处理dir中的文件时,派生类的ProcessFile有可能改变了 //当前目录,因此还要重新设置当前目录为dir。 //执行过_findfirst后,可能系统记录下了相关信息,因此改变目录 //对_findnext没有影响。 _chdir(dir); if((hFile=_findfirst("*.*",&fileinfo)) != -1) { do { //检查是不是目录 //如果是,再检查是不是 . 或 .. //如果不是,进行迭代 if((fileinfo.attrib & _A_SUBDIR)) { if(strcmp(fileinfo.name,".") != 0 &&strcmp (fileinfo.name,"..") != 0) { charsubdir[_MAX_PATH]; strcpy(subdir,dir); strcat(subdir,fileinfo.name); strcat(subdir,"\"); ProcessDir(subdir,dir); if(!BrowseDir(subdir,filespec)) returnfalse; } } }while(_findnext(hFile,&fileinfo) == 0); _findclose(hFile); } returntrue; }
vector { _chdir(dir); vector filename_vector.clear();
//首先查找dir中符合要求的文件 longhFile; _finddata_tfileinfo; if((hFile=_findfirst(filespec,&fileinfo)) != -1) { do { //检查是不是目录 //如果不是,则进行处理 if(!(fileinfo.attrib & _A_SUBDIR)) { charfilename[_MAX_PATH]; strcpy(filename,dir); strcat(filename,fileinfo.name); filename_vector.push_back(filename); } }while(_findnext(hFile,&fileinfo) == 0); _findclose(hFile); } //查找dir中的子目录 //因为在处理dir中的文件时,派生类的ProcessFile有可能改变了 //当前目录,因此还要重新设置当前目录为dir。 //执行过_findfirst后,可能系统记录下了相关信息,因此改变目录 //对_findnext没有影响。 _chdir(dir); if((hFile=_findfirst("*.*",&fileinfo)) != -1) { do { //检查是不是目录 //如果是,再检查是不是 . 或 .. //如果不是,进行迭代 if((fileinfo.attrib & _A_SUBDIR)) { if(strcmp(fileinfo.name,".") != 0 &&strcmp (fileinfo.name,"..") != 0) { charsubdir[_MAX_PATH]; strcpy(subdir,dir); strcat(subdir,fileinfo.name); strcat(subdir,"\"); ProcessDir(subdir,dir); vector for(vector { filename_vector.push_back(*it); } } } }while(_findnext(hFile,&fileinfo) == 0); _findclose(hFile); } returnfilename_vector; }
boolCBrowseDir::ProcessFile(constchar*filename) { returntrue; }
voidCBrowseDir::ProcessDir(constchar *currentdir,constchar*parentdir) { }
//从CBrowseDir派生出的子类,用来统计目录中的文件及子目录个数 classCStatDir:publicCBrowseDir { protected: intm_nFileCount; //保存文件个数 intm_nSubdirCount;//保存子目录个数
public: //缺省构造器 CStatDir() { //初始化数据成员m_nFileCount和m_nSubdirCount m_nFileCount=m_nSubdirCount=0; }
//返回文件个数 intGetFileCount() { returnm_nFileCount; }
//返回子目录个数 intGetSubdirCount() { //因为进入初始目录时,也会调用函数ProcessDir, //所以减1后才是真正的子目录个数。 returnm_nSubdirCount-1; }
protected: //覆写虚函数ProcessFile,每调用一次,文件个数加1 virtualboolProcessFile(constchar*filename) { m_nFileCount++; returnCBrowseDir::ProcessFile(filename); }
//覆写虚函数ProcessDir,每调用一次,子目录个数加1 virtualvoidProcessDir (constchar*currentdir,constchar*parentdir) { m_nSubdirCount++; CBrowseDir::ProcessDir(currentdir,parentdir); } };
voidmain() { //获取目录名 charbuf[256]; printf("请输入要统计的目录名:"); gets(buf);
//构造类对象 CStatDir statdir;
//设置要遍历的目录 if(!statdir.SetInitDir(buf)) { puts("目录不存在。"); return; }
//开始遍历
vector for(vector std::cout<<*it< printf("文件总数: %dn",file_vec.size()); system("pause"); } |
相关文章
- 江南百景图碎金泉怎么样 12-26
- 江南百景图游宴廊怎么样 江南百景图游宴廊建筑介绍 12-26
- 江南百景图碎金泉怎么样 江南百景图碎金泉建筑介绍 12-26
- 炉石传说兑换码大全 12-26
- 重返未来1999趋光性研究夜幕之外怎么玩 趋光性夜幕之外活动介绍 12-26
- 光遇12.26大蜡烛在哪里 光遇12月26日大蜡烛位置攻略 12-26