• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C++ 遍历目录下文件简单实现实例

C++ 遍历目录下文件简单实现实例

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c++遍历数组,c++ map遍历,二叉树的遍历算法c++,c++图的遍历,c++ vector遍历等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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()); 
}  

</div>

已在windows上验证有效。

下面我加了BeginBrowseFilenames函数,以vector<char*>形式返回目录中所有文件名。

实例代码:

#include "stdlib.h" 
#include "direct.h" 
#include "string.h" 
#include "string" 
#include "io.h" 
#include "stdio.h"  
#include <vector> 
#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<string> BeginBrowseFilenames(const char *filespec); 
 
protected: 
  //遍历目录dir下由filespec指定的文件 
  //对于子目录,采用迭代的方法 
  //如果返回false,表示中止遍历文件 
  bool BrowseDir(const char *dir,const char *filespec); 
  vector<string> 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); 



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C++ 遍历目录下文件简单实现实例

相关文章

  • 2022-04-30C语言指针数组(数组每个元素都是指针)详解
  • 2017-05-28C基础 mariadb处理的简单实例
  • 2017-05-28C++中关于[]静态数组和new分配的动态数组的区别分析
  • 2017-05-28C++基础入门教程(四):枚举和指针
  • 2017-05-28C语言的Struct Hack笔记
  • 2017-05-28C++中单链表的建立与基本操作
  • 2017-05-28如何求连续几个数之和的最大值
  • 2017-05-28显示任何进程加载的DLL文件的代码
  • 2017-05-28深入理解数组指针与指针数组的区别
  • 2017-05-28Cocos2d-x UI开发之场景切换代码实例

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • ShellExecute函数用法的实例代码
    • C++ 中placement new 操作符使用方法
    • 利用反射获得类的public static/const成员的值实例
    • 举例剖析C++中引用的本质及引用作函数参数的使用
    • 全局变量与局部变量在内存中的区别详细解析
    • C++ 反射机制详解及实例代码
    • C++访问注册表获取已安装软件信息列表示例代码
    • C语言中的整数(short,int,long)
    • 使用C# 判断给定大数是否为质数的详解
    • 浅析int*p[ ]与int(*p)[ ]的区别

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有