千家信息网

C++怎么实现遍历目录下文件

发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,本篇内容主要讲解"C++怎么实现遍历目录下文件",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"C++怎么实现遍历目录下文件"吧!C++ 遍历目录下文件fun
千家信息网最后更新 2025年02月02日C++怎么实现遍历目录下文件

本篇内容主要讲解"C++怎么实现遍历目录下文件",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"C++怎么实现遍历目录下文件"吧!

C++ 遍历目录下文件

function:遍历目录下所有文件,返回文件总数,子文件夹总数(修改一下可以获得全部文件名等)。

实例代码:

#include "stdlib.h" #include "direct.h" #include "string.h" #include "io.h" #include "stdio.h"  #include "iostream" using namespace std;  class CBrowseDir { protected:   //存放初始目录的绝对路径,以'\'结尾   char m_szInitDir[_MAX_PATH];  public:   //缺省构造器   CBrowseDir();    //设置初始目录为dir,如果返回false,表示目录不可用   bool SetInitDir(const char *dir);    //开始遍历初始目录及其子目录下由filespec指定类型的文件   //filespec可以使用通配符 * ?,不能包含路径。   //如果返回false,表示遍历过程被用户中止   bool BeginBrowse(const char *filespec);  protected:   //遍历目录dir下由filespec指定的文件   //对于子目录,采用迭代的方法   //如果返回false,表示中止遍历文件   bool BrowseDir(const char *dir,const char *filespec);    //函数BrowseDir每找到一个文件,就调用ProcessFile   //并把文件名作为参数传递过去   //如果返回false,表示中止遍历文件   //用户可以覆写该函数,加入自己的处理代码   virtual bool ProcessFile(const char *filename);    //函数BrowseDir每进入一个目录,就调用ProcessDir   //并把正在处理的目录名及上一级目录名作为参数传递过去   //如果正在处理的是初始目录,则parentdir=NULL   //用户可以覆写该函数,加入自己的处理代码   //比如用户可以在这里统计子目录的个数   virtual void ProcessDir(const char *currentdir,const char *parentdir); };  CBrowseDir::CBrowseDir() {   //用当前目录初始化m_szInitDir   getcwd(m_szInitDir,_MAX_PATH);    //如果目录的最后一个字母不是'\',则在最后加上一个'\'   int len=strlen(m_szInitDir);   if (m_szInitDir[len-1] != '\\')     strcat(m_szInitDir,"\\"); }  bool CBrowseDir::SetInitDir(const char *dir) {   //先把dir转换为绝对路径   if (_fullpath(m_szInitDir,dir,_MAX_PATH) == NULL)     return false;    //判断目录是否存在   if (_chdir(m_szInitDir) != 0)     return false;    //如果目录的最后一个字母不是'\',则在最后加上一个'\'   int len=strlen(m_szInitDir);   if (m_szInitDir[len-1] != '\\')     strcat(m_szInitDir,"\\");    return true; }  bool CBrowseDir::BeginBrowse(const char *filespec) {   ProcessDir(m_szInitDir,NULL);   return BrowseDir(m_szInitDir,filespec); }  bool CBrowseDir::BrowseDir(const char *dir,const char *filespec) {   _chdir(dir);    //首先查找dir中符合要求的文件   long hFile;   _finddata_t fileinfo;   if ((hFile=_findfirst(filespec,&fileinfo)) != -1)   {     do     {       //检查是不是目录       //如果不是,则进行处理       if (!(fileinfo.attrib & _A_SUBDIR))       {         char filename[_MAX_PATH];         strcpy(filename,dir);         strcat(filename,fileinfo.name);         cout << filename << endl;         if (!ProcessFile(filename))           return false;       }     } 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)         {           char subdir[_MAX_PATH];           strcpy(subdir,dir);           strcat(subdir,fileinfo.name);           strcat(subdir,"\\");           ProcessDir(subdir,dir);           if (!BrowseDir(subdir,filespec))             return false;         }       }     } while (_findnext(hFile,&fileinfo) == 0);     _findclose(hFile);   }   return true; }  bool CBrowseDir::ProcessFile(const char *filename) {   return true; }  void CBrowseDir::ProcessDir(const char    *currentdir,const char *parentdir) { }  //从CBrowseDir派生出的子类,用来统计目录中的文件及子目录个数 class CStatDir:public CBrowseDir { protected:   int m_nFileCount;  //保存文件个数   int m_nSubdirCount; //保存子目录个数  public:   //缺省构造器   CStatDir()   {     //初始化数据成员m_nFileCount和m_nSubdirCount     m_nFileCount=m_nSubdirCount=0;   }    //返回文件个数   int GetFileCount()   {     return m_nFileCount;   }    //返回子目录个数   int GetSubdirCount()   {     //因为进入初始目录时,也会调用函数ProcessDir,     //所以减1后才是真正的子目录个数。     return m_nSubdirCount-1;   }  protected:   //覆写虚函数ProcessFile,每调用一次,文件个数加1   virtual bool ProcessFile(const char *filename)   {     m_nFileCount++;     return CBrowseDir::ProcessFile(filename);   }    //覆写虚函数ProcessDir,每调用一次,子目录个数加1   virtual void ProcessDir     (const char *currentdir,const char *parentdir)   {     m_nSubdirCount++;     CBrowseDir::ProcessDir(currentdir,parentdir);   } };  void main() {   //获取目录名   char buf[256];   printf("请输入要统计的目录名:");   gets(buf);    //构造类对象   CStatDir statdir;    //设置要遍历的目录   if (!statdir.SetInitDir(buf))   {     puts("目录不存在。");     return;   }    //开始遍历   statdir.BeginBrowse("*.*");   printf("文件总数: %d\n子目录总数:%d\n",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" using namespace std;  class CBrowseDir { protected:   //存放初始目录的绝对路径,以'\'结尾   char m_szInitDir[_MAX_PATH];  public:   //缺省构造器   CBrowseDir();    //设置初始目录为dir,如果返回false,表示目录不可用   bool SetInitDir(const char *dir);    //开始遍历初始目录及其子目录下由filespec指定类型的文件   //filespec可以使用通配符 * ?,不能包含路径。   //如果返回false,表示遍历过程被用户中止   bool BeginBrowse(const char *filespec);   vector BeginBrowseFilenames(const char *filespec);  protected:   //遍历目录dir下由filespec指定的文件   //对于子目录,采用迭代的方法   //如果返回false,表示中止遍历文件   bool BrowseDir(const char *dir,const char *filespec);   vector GetDirFilenames(const char *dir,const char *filespec);   //函数BrowseDir每找到一个文件,就调用ProcessFile   //并把文件名作为参数传递过去   //如果返回false,表示中止遍历文件   //用户可以覆写该函数,加入自己的处理代码   virtual bool ProcessFile(const char *filename);    //函数BrowseDir每进入一个目录,就调用ProcessDir   //并把正在处理的目录名及上一级目录名作为参数传递过去   //如果正在处理的是初始目录,则parentdir=NULL   //用户可以覆写该函数,加入自己的处理代码   //比如用户可以在这里统计子目录的个数   virtual void ProcessDir(const char *currentdir,const char *parentdir); };  CBrowseDir::CBrowseDir() {   //用当前目录初始化m_szInitDir   getcwd(m_szInitDir,_MAX_PATH);    //如果目录的最后一个字母不是'\',则在最后加上一个'\'   int len=strlen(m_szInitDir);   if (m_szInitDir[len-1] != '\\')     strcat(m_szInitDir,"\\"); }  bool CBrowseDir::SetInitDir(const char *dir) {   //先把dir转换为绝对路径   if (_fullpath(m_szInitDir,dir,_MAX_PATH) == NULL)     return false;    //判断目录是否存在   if (_chdir(m_szInitDir) != 0)     return false;    //如果目录的最后一个字母不是'\',则在最后加上一个'\'   int len=strlen(m_szInitDir);   if (m_szInitDir[len-1] != '\\')     strcat(m_szInitDir,"\\");    return true; }  vector CBrowseDir::BeginBrowseFilenames(const char *filespec) {   ProcessDir(m_szInitDir,NULL);   return GetDirFilenames(m_szInitDir,filespec); }  bool CBrowseDir::BeginBrowse(const char *filespec) {   ProcessDir(m_szInitDir,NULL);   return BrowseDir(m_szInitDir,filespec); }  bool CBrowseDir::BrowseDir(const char *dir,const char *filespec) {   _chdir(dir);    //首先查找dir中符合要求的文件   long hFile;   _finddata_t fileinfo;   if ((hFile=_findfirst(filespec,&fileinfo)) != -1)   {     do     {       //检查是不是目录       //如果不是,则进行处理       if (!(fileinfo.attrib & _A_SUBDIR))       {         char filename[_MAX_PATH];         strcpy(filename,dir);         strcat(filename,fileinfo.name);         cout << filename << endl;         if (!ProcessFile(filename))           return false;       }     } 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)         {           char subdir[_MAX_PATH];           strcpy(subdir,dir);           strcat(subdir,fileinfo.name);           strcat(subdir,"\\");           ProcessDir(subdir,dir);           if (!BrowseDir(subdir,filespec))             return false;         }       }     } while (_findnext(hFile,&fileinfo) == 0);     _findclose(hFile);   }   return true; }  vector CBrowseDir::GetDirFilenames(const char *dir,const char *filespec) {   _chdir(dir);   vectorfilename_vector;   filename_vector.clear();    //首先查找dir中符合要求的文件   long hFile;   _finddata_t fileinfo;   if ((hFile=_findfirst(filespec,&fileinfo)) != -1)   {     do     {       //检查是不是目录       //如果不是,则进行处理       if (!(fileinfo.attrib & _A_SUBDIR))       {         char filename[_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)         {           char subdir[_MAX_PATH];           strcpy(subdir,dir);           strcat(subdir,fileinfo.name);           strcat(subdir,"\\");           ProcessDir(subdir,dir);           vectortmp= GetDirFilenames(subdir,filespec);           for (vector::iterator it=tmp.begin();itfile_vec = statdir.BeginBrowseFilenames("*.*");   for(vector::const_iterator it = file_vec.begin(); it < file_vec.end(); ++it)      std::cout<<*it<

到此,相信大家对"C++怎么实现遍历目录下文件"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

目录 文件 子目 子目录 个数 函数 处理 检查 用户 目录名 代码 路径 统计 总数 迭代 参数 字母 文件名 正在 构造器 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 南宁高新区软件开发园地址 杭州人工智能软件开发靠谱吗 海淀区质量软件开发单价 北京服务器招代理 江苏互联网络技术服务多少钱 实时数据库运算点 我的世界服务器怎么才更好玩 软件开发软件著作权归谁 免费软件开发为什么能赚钱 服务器租用费用有多少 消息队列信息写数据库 cmd切换数据库 农安有口碑的网络技术服务有哪些 镜像根服务器生产厂家 构建数据库的要点 网络安全应注意什么简答题 怀旧服新服务器什么时候能转入 网络安全加固询价函 网络安全 杂志 主编 越秀区数据网络技术开发分类 北京服务器招代理 新中特对网络安全的认识 最全的蛋白组数据库 税控盘数据库错误怎么办 加拿大工业软件开发 深圳软件开发产业 公安队伍守护网络安全宣传稿 嵌入式服务器能用在什么地方 先进的售后服务管理软件开发 首届网络安全产业大会
0