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"); } |
茶杯头甜蜜终章dlc 官方手机版v1.0.0.3
下载火柴人传说暗影格斗内置菜单 最新版v3.0.1
下载荒野乱斗测试服 安卓版v61.10.3
下载荒野乱斗彩虹服 安卓版v61.10.3
下载寒霜启示录 安卓版v1.25.10
寒霜启示录是一款生存模拟游戏,不少玩家可能对于末日都有着自己
末日城堡免广告版 安卓最新版v0.7.1
末日城堡免广告版是一款非常好玩的模拟经营类游戏,内部可以不看
甜蜜人生模拟器 最新版v1.4.5
甜蜜人生模拟器是一款非常好玩的模拟恋爱手游,玩家在这里能够对
武器锻造师内置功能菜单 v10.4
武器锻造师内置菜单版是游戏的破解版本,在该版本中为玩家提供了
开放空间overfield 安卓版v1.0.5
开放空间Overfield是一款箱庭养成经营手游,让你在广阔