精华内容
下载资源
问答
  • 主要介绍了C语言 实现遍历一个文件夹所有文件的相关资料,需要的朋友可以参考
  • c语言遍历文件夹

    2017-05-26 13:26:32
    c语言遍历文件夹
  • C语言遍历文件夹所有文件

    热门讨论 2009-12-26 22:20:21
    直接编译可以运行。运行时输入盘符如"d:"或者输入文件夹如:“c:\\window”等。可能文件比较多,需要遍历一段时间。为了方便检测,最好自己制定一个文件比较少的文件夹
  • c语言递归遍历指定文件夹下所有文件算法
  • C语言遍历文件下指定后缀文件(包括子文件夹)
  • C语言遍历文件夹目录中文件和文件夹
  • 这篇文章主要介绍了 C++ 遍历文件夹下所有文件的多种方法,需要的朋友可以参考下 文章目录C++ 遍历文件夹下所有文件的多种方法一、实现方法一二、实现方法二三、实现方法三四、实现方法四 C++ 遍历文件夹下所有文件...

    这篇文章主要介绍了 C++ 遍历文件夹下所有文件的多种方法,需要的朋友可以参考下


    C++ 遍历文件夹下所有文件的多种方法

    一、实现方法一

    为数不多的好用的代码,遍历文件夹获取所有子文件名,“filespec” 可用通配符 “*?”。注意如果用相对路径的话,获取所有文件名后应再调用 SetInitDir 将初始目录改为当前目录,否则中间生成的文件都会放在之前的 “InitDir” 内。
    C/C++ 遍历文件夹感觉真是很不好用,建议还是使用 C/C++ 做单任务处理,然后通过脚本语言实现遍历比较合理。

    CBrowseDir.h

    #include <io.h> 
    #include <stdlib.h> 
    #include <direct.h> 
    #include <iostream> 
    #include <string> 
    #include <vector> 
    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.cpp

    #include "CBrowseDir.h" 
     
    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<string> 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<string> CBrowseDir::GetDirFilenames(const char *dir,const char *filespec) 
    { 
      _chdir(dir); 
      vector<string>filename_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); 
              vector<string>tmp= GetDirFilenames(subdir,filespec); 
              for (vector<string>::iterator it=tmp.begin();it<tmp.end();it++) 
              { 
                filename_vector.push_back(*it); 
              } 
            } 
          } 
        } while (_findnext(hFile,&fileinfo) == 0); 
        _findclose(hFile); 
      } 
      return filename_vector; 
    } 
     
    bool CBrowseDir::ProcessFile(const char *filename) 
    { 
      return true; 
    } 
     
    void CBrowseDir::ProcessDir(const char  
      *currentdir,const char *parentdir) 
    { 
    }
    

    二、实现方法二

    数据分多个文件存储,读取数据就需要对多个文件进行操作。首先就需要定位到文件的名字,之后再对文件进行相应的读写操作。多次涉及多文件的读写操作,现将这个实现总结一下,方便自己和他人使用。具体代码如下:

    #include "stdafx.h" 
    #include <stdio.h> 
    #include<iostream> 
    #include<vector> 
    #include <Windows.h> 
    #include <fstream>  
    #include <iterator> 
    #include <string> 
    using namespace std; 
     
    #define MAX_PATH 1024 //最长路径长度 
     
    /*---------------------------- 
     * 功能 : 递归遍历文件夹,找到其中包含的所有文件 
     *---------------------------- 
     * 函数 : find 
     * 访问 : public  
     * 
     * 参数 : lpPath [in]   需遍历的文件夹目录 
     * 参数 : fileList [in]  以文件名称的形式存储遍历后的文件 
     */ 
    void find(char* lpPath,std::vector<const std::string> &fileList) 
    { 
      char szFind[MAX_PATH]; 
      WIN32_FIND_DATA FindFileData; 
       
      strcpy(szFind,lpPath); 
      strcat(szFind,"\\*.*"); 
     
      HANDLE hFind=::FindFirstFile(szFind,&FindFileData); 
      if(INVALID_HANDLE_VALUE == hFind)  return; 
     
      while(true) 
      { 
        if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
        { 
          if(FindFileData.cFileName[0]!='.') 
          { 
            char szFile[MAX_PATH]; 
            strcpy(szFile,lpPath); 
            strcat(szFile,"\\"); 
            strcat(szFile,(char* )(FindFileData.cFileName)); 
            find(szFile,fileList); 
          } 
        } 
        else 
        { 
          //std::cout << FindFileData.cFileName << std::endl; 
          fileList.push_back(FindFileData.cFileName); 
        } 
        if(!FindNextFile(hFind,&FindFileData))  break; 
      } 
      FindClose(hFind); 
    } 
     
     
    int main() 
    { 
      std::vector<const std::string> fileList;//定义一个存放结果文件名称的链表 
     
      //遍历一次结果的所有文件,获取文件名列表 
      find("XXXX具体文件夹目录",fileList);//之后可对文件列表中的文件进行相应的操作 
     
      //输出文件夹下所有文件的名称 
      for(int i = 0; i < fileList.size(); i++) 
      { 
        cout << fileList[i] << endl; 
      } 
      cout << "文件数目:" << fileList.size() << endl; 
      return 0; 
    }
    

    测试了一下,目标文件夹下的文件名称存在了 fileList 容器中,根据读取的文件名称,可对文件进行相应的操作,输出结果如下所示:

    在这里插入图片描述

    三、实现方法三

    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<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); 
      if (m_szInitDir[len-1] != '\\') 
        strcat(m_szInitDir,"\\"); 
     
      return true; 
    } 
     
    vector<string> 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<string> CBrowseDir::GetDirFilenames(const char *dir,const char *filespec) 
    { 
      _chdir(dir); 
      vector<string>filename_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); 
              vector<string>tmp= GetDirFilenames(subdir,filespec); 
              for (vector<string>::iterator it=tmp.begin();it<tmp.end();it++) 
              { 
                filename_vector.push_back(*it); 
              } 
            } 
          } 
        } while (_findnext(hFile,&fileinfo) == 0); 
        _findclose(hFile); 
      } 
      return filename_vector; 
    } 
     
    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; 
      } 
     
      //开始遍历 
     
      vector<string>file_vec = statdir.BeginBrowseFilenames("*.*"); 
      for(vector<string>::const_iterator it = file_vec.begin(); it < file_vec.end(); ++it) 
         std::cout<<*it<<std::endl; 
       
      printf("文件总数: %d\n",file_vec.size()); 
      system("pause"); 
    } 
    

    四、实现方法四

    下面是输出当前目录下的所有文件夹以及文件的绝对路径(当然也可以是相对路径,由输入的路径决定),下面的函数接口可以改装为单输出文件或者文件夹的接口,这是一个大方面的总接口。

    #include <fstream>
    #include <iostream>
    #include <string>
    #include <sstream>
    #include <vector>
    using namespace std;
    void getAllFiles(string path, vector<string>& files)
    {
      //文件句柄 
      long  hFile = 0;
      //文件信息 
      struct _finddata_t fileinfo; //很少用的文件信息读取结构
      string p; //string类很有意思的一个赋值函数:assign(),有很多重载版本
      if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)
      {
        do
        {
          if ((fileinfo.attrib & _A_SUBDIR)) //判断是否为文件夹
          {
            if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
            {
            files.push_back(p.assign(path).append("/").append(fileinfo.name));//保存文件夹名字
              getAllFiles(p.assign(path).append("/").append(fileinfo.name), files);//递归当前文件夹
            }
          }
          else  //文件处理
          {
            files.push_back(p.assign(path).append("/").append(fileinfo.name));//文件名
          }
        } while (_findnext(hFile, &fileinfo) == 0); //寻找下一个,成功返回0,否则-1
        _findclose(hFile);
      }
    }
    //测试
    void main()
    {
      string DATA_DIR = "D:/CoderMaker/data_sets/lfw";
      vector<string> files;
      //测试
      char * DistAll = "AllFiles.txt";
      getAllFiles(DATA_DIR, files);//所有文件与文件夹的路径都输出
      ofstream ofn(DistAll); //输出文件流
      int size = files.size();
      int FaiNum = 0;
      ofn << size << endl;
      for (int i = 0; i<size; i++)
      {
        ofn << files[i] << endl;
      }
      ofn.close();
      return 0;
    }
    

    测试结果:
    在这里插入图片描述


    展开全文
  • 采用c语言编程,递归遍历一个文件夹中的所有文件,包括子文件夹
  • /******************************************* 作者: chengshuguang* 版本: 1.0* 时间: 2013年11月* 程序说明:* 输入:./a.out 比如:列出home所有* 文件,只需要输入./a.out /home***********************...

    /******************************************

    * 作者: chengshuguang

    * 版本: 1.0

    * 时间: 2013年11月

    * 程序说明:

    * 输入:./a.out 比如:列出home下的所有

    * 文件,只需要输入./a.out /home

    ******************************************/

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #define MAX_PATH_LEN 512

    int count =0;

    char dirPath[MAX_PATH_LEN];

    void listAllFiles(char *dirname)

    {

    assert(dirname != NULL);

    char path[512];

    struct dirent *filename;//readdir 的返回类型

    DIR *dir;//血的教训阿,不要随便把变量就设成全局变量。。。。

    dir = opendir(dirname);

    if(dir == NULL)

    {

    printf("open dir %s error!\n",dirname);

    exit(1);

    }

    while((filename = readdir(dir)) != NULL)

    {

    //目录结构下面问什么会有两个.和..的目录? 跳过着两个目录

    if(!strcmp(filename->d_name,".")||!strcmp(filename->d_name,".."))

    continue;

    //非常好用的一个函数,比什么字符串拼接什么的来的快的多

    sprintf(path,"%s/%s",dirname,filename->d_name);

    struct stat s;

    lstat(path,&s);

    if(S_ISDIR(s.st_mode))

    {

    listAllFiles(path);//递归调用

    }

    else

    {

    printf("%d. %s\n",++count,filename->d_name);

    }

    }

    closedir(dir);

    }

    int main(int argc, char **argv)

    {

    if(argc != 2)

    {

    printf("one dir required!(for eample: ./a.out /home/myFolder)\n");

    exit(1);

    }

    strcpy(dirPath,argv[1]);

    listAllFiles(dirPath);

    printf("total files:%d\n",count);

    return 0;

    }转载请注明出处:http://blog.csdn.net/blogofshuguang/article/details/17040915

    展开全文
  • c c++ c语言遍历文件夹 c语言读文件 c语言写文件 高效算法
  • C语言遍历文件夹 首先首先根据参考资料中文章理解遍历文件夹的方法。 #include <stdio.h> #include <string.h> #include <dirent.h> void myfilerecursive(char *path); int main() { // ...

    参考资料:
    C语言遍历文件夹

    首先首先根据参考资料中文章理解遍历文件夹的方法。

    #include <stdio.h>
    #include <string.h>
    #include <dirent.h> 
    
    void myfilerecursive(char *path);
    
    
    int main()
    {
        // 文件夹名称
        char name[100000] = "D:\\test"; 
        // printf("Enter path to list files: ");
        // scanf("%s", name);
    
        myfilerecursive(name);
    
        return 0;
    }
    
    void myfilerecursive(char *basePath)
    {
    	// 路径
        char path[1000];
        struct dirent *dp;
        DIR *dir = opendir(basePath);
    
       	// 如果是文件则直接结束此次调用
        if (!dir) {
            return;
        }
    
        while ((dp = readdir(dir)) != NULL)
        {
        	// 跳过 "." 和 ”..“
            if (strcmp(dp->d_name, ".") != 0 && strcmp(dp->d_name, "..") != 0)
            {
            	// 将文件名和路径进行拼接形成一个完整路径
                printf("%s\n", dp->d_name);
                strcpy(path, basePath);
                strcat(path, "/");
                strcat(path, dp->d_name);
    			// 递归遍历
                myfilerecursive(path);
            }
        }
        closedir(dir);
    }
    

    这是 结构体 dirent 的结构,通过访问这个结构体中数据可以获取文件名
    结构体 dirent 的结构

    进阶

    题目描述
         遍历一个文件夹,将遍历得到的信息(文件名、文件类型、文件大小等)保存至结构体中,然后再把结构体中的信息保存至一个文件中。

    代码
    对于代码的理解请看注释

    #include <stdio.h>
    #include <string.h>
    #include <dirent.h>
    
    void myfilerecursive(char *path, struct FILE_STR *fileStrs);
    int get_file_size(char *filePath);
    char* get_suffix(char* dest, char* filename);
    char *right(char *dest, char *src, int n);
    
    // 文件信息结构体
    // 注意:结构中应当使用数组而不是指针,否则写入文件时无法正确获取指针的结束位
    typedef struct FILE_STR{
        char filename[100]; // 文件名
        char fileType[10];   // 文件类型(文件夹或文件)
        int fileSize;   // 文件大小
        char suffix[10];    // 文件后缀
    } file_str;
    
    // 全局变量,记录结构体数量(或者使用指针作为参数代替)
    int count = 0;
    
    int main() {
    
        char name[10000];
        // printf("Enter path to list files: ");
        // scanf("%s", name);
    
        // myfilerecursive(name);
        char basePath[100] = "F:\\tmp";
        file_str fileStrs[100];
        // 递归遍历文件夹,并将信息保存至结构体数组中
        myfilerecursive(basePath, fileStrs);
        
        // 定义一个文件指针
        FILE *fp ;
        // 打开文件,没有文件自动创建
        if((fp=fopen("files.txt","w"))==NULL) {
            perror("fopen");
            printf("====error====");
        }
        int i = 0;
        // 将结构体数组中的信息保存至文件中
        while (i < count){
            // 写入数据至文件中  (注意:如果其他步骤除了问题(虽然没有报错),这一步基本也不会成功,可以把这个放在循环外,看看是否有问题)
            fprintf(fp,"filename:%s \tfileType:%s \tfileSize:%d \tsuffix:%s\n", fileStrs[i].filename, 
                fileStrs[i].fileType, fileStrs[i].fileSize, fileStrs[i].suffix);
            i++;
        }
        // 必须要关闭,否则内容不会写入文件中
        fclose(fp);
        return 0;
    }
    
    void myfilerecursive(char *basePath, file_str *fileStrs) {
        // path 作为一个目录,记录当前访问的目录
        char path[1000];
        // 定义结构体数组(指针)
        struct dirent *dp;
        DIR *dir = opendir(basePath);
        // if (!dir) {
        //     return; 
        // }
        // 以上写法等同于
        if (dir == NULL) {
            // 如果该路径(path)不可读,则直接结束此次方法调用
            return;
        }
        while ((dp = readdir(dir)) != NULL) {
            // 不读取 "." 和 ".."
            if (strcmp(dp->d_name, ".") != 0 && strcmp(dp->d_name, "..") != 0)
            {
                // 定义结构体
                file_str fileStr;
                strcpy(fileStr.filename, dp->d_name); // fileStr.filename = dp->d_name; 指针写法在将信息写入文件时有问题
                // 复制 basePath 至 path
                strcpy(path, basePath);
                // 将 / 追加到 path 中,拼接为一个目录
                strcat(path, "/");
                // 将文件名或目录名(d_name)追加到 path 中
                strcat(path, dp->d_name);
                // 判断是否是文件夹
                DIR *isDir = opendir(path);
                int size = get_file_size(path);
                if (isDir != NULL) {
                    // warning: ISO C++ forbids converting a string constant to 'char*'
                    char tmp[10] = "文件夹";
                    strcpy(fileStr.fileType, tmp); // fileStr.fileType = tmp;
                } else {
                    fileStr.fileSize = size;
                    char tmp[10] = "文件";
                    strcpy(fileStr.fileType, tmp); // fileStr.fileType = tmp;
                    
                    char suf[10];
                    get_suffix(suf, dp->d_name);
                    strcpy(fileStr.suffix, suf); // fileStr.suffix = suf;
                }
                // fileStr.filename = dp->d_name;
                fileStrs[count++] = fileStr;
                // 递归调用
                myfilerecursive(path, fileStrs);
            }
        }
        closedir(dir);
    }
    
    // 获取文件大小
    int get_file_size(char* filePath)
    {
        FILE *fp=fopen(filePath,"r");
        if(!fp) {
            return -1;
        }
        fseek(fp,0L,SEEK_END);
        int size=ftell(fp);
        fclose(fp);
        
        return size;
    }
    
    // 获取文件名后缀
    char* get_suffix(char* dest, char* filename) {
        // 注意:strlen()函数得到英文和中文字符的长度不一样
        int len = strlen(filename);
        int i;
        for (i = len - 1; i >= 0; i--) {
            // 最后一次出现字符 '.' 的位置
            if (filename[i] == '.') {
                right(dest, filename, len - i - 1);
                break;
            }
        }
        return dest;
    }
    
    // 从右边开始截取指定数量字符串
    char *right(char *dest, char *src, int n) {
        char *p = dest;
        char *q = src;
        int len = strlen(src);
    
        if (n > len) {
            n = len;
        }
        //int start=len-n;
        //q=q+start;
        q += len - n;
        while (n--) {
            *(p++) = *(q++);    
        }
        *(p++) = '\0';
        return dest;
    }
    

    遍历文件夹的目录结构:
    在这里插入图片描述

    最终保存文件结果:
    结果

    展开全文
  • 1 #include<iostream> 2 #include<string> 3 #include<io.h> 4 using namespace std; 5 6 void filesearch(string path,int layer) 7 { 8 ...
     1 #include<iostream>   
     2   #include<string>   
     3   #include<io.h>   
     4   using namespace std; 
     5 
     6   void   filesearch(string path,int layer)   
     7   {   
     8           struct _finddata_t   filefind;   
     9           string  curr=path+"\\*.*";   
    10           int   done=0,i,handle;   
    11           if((handle=_findfirst(curr.c_str(),&filefind))==-1)
    12               return; 
    13                 
    14           while(!(done=_findnext(handle,&filefind)))   
    15           {   
    16                       printf("测试的--%s\n",filefind.name);
    17                   if(!strcmp(filefind.name,"..")){
    18                       
    19                           continue;
    20                   }
    21                   
    22                   for(i=0;i<layer;i++)
    23                           cout<<"     "; 
    24                 
    25                 
    26                 
    27                     
    28                   if   ((_A_SUBDIR==filefind.attrib))   
    29                   {           
    30                               printf("----------%s\n",filefind.name);    
    31                           cout<<filefind.name<<"(dir)"<<endl;   
    32                           curr=path+"\\"+filefind.name;   
    33                          filesearch(curr,layer+1);   
    34                   }   
    35                   else     
    36                   {   
    37                           cout<<filefind.name<<endl;   
    38                   }   
    39           }           
    40           _findclose(handle);               
    41   }   
    42   int   main()   
    43   {           
    44           string   path;   
    45           cout<<"请输入目录"<<endl;   
    46           cin>>path;   
    47           filesearch(path,0);   
    48           system("PAUSE");   
    49           return   0;   
    50   }   
    51   

    转载于:https://www.cnblogs.com/freedesert/archive/2012/07/19/2600017.html

    展开全文
  • void printdir(char *dir, int depth) {  DIR *dp;  struct dirent *entry;  struct stat statbuf;... if( (dp = opendir(dir)) == NULL ){ ... fprintf(stderr,"cannot open directory: %s\n",
  • linux C 遍历目录及其子目录#include #include #include #include #include #include #include using namespace std;void listDir(char *path){DIR *pDir ;struct dirent *ent ;int i=0 ;cha...
  • #include <...int ReadDir(char *path) //读取文件 { DIR *dir; char pathname[255]; //目录的全名,=当前目录名+子目录名 if((dir = opendir(path))==0) //无法打开则跳过 { printf
  • C语言 遍历一个文件夹所有文件

    万次阅读 2016-11-27 18:43:20
    #include #include int main (void) {  _finddata_t fileDir;  long lfDir;  if((lfDir = _findfirst(dir,&fileDir))==-1l)  printf("No file is found\n");  else{  
  • c遍历一个文件夹下所有文件包括子文件夹c#遍历一个文件夹下所有文件包括子文件夹using System; using System.IO;class ListAllFilesDemo { public static void Main() { Console.Write( "请输入要查询的目录: ")...
  • void listFiles(const char* dir) //dir为文件夹绝对路径(带文件夹名字) { char dirNew[200]; strcpy_s(dirNew, dir); strcat_s(dirNew, "\\*.*"); // 在目录后面加上"\\*.*"进行第一次搜索 intptr_t handle;...
  • 大项目时时常需要抽出属于自己编写的那部分代码,从SVN下载后,往往需要一个个的进入文件夹下拿取相应的文件。这样很浪费时间,虽然使用bat编写确实更快,但是我觉得使用C语言可能在文件过多时会快一点,也是为了 ...
  • 假设a文件夹在F盘,代码如下。将文件名输出到一个ListBox中using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.IO;namespace WindowsForms...
  • #include &...//用于保存搜索文件数的全局变量 long fileNum = 0; //通过SearchFile返回的字符串搜索文件 void SearchExt(const char *fileRoad,const char *fileExt) { char absPath[MAX_PATH] ...
  • 主要介绍了node.js与C语言 实现遍历文件夹下最大的文件,并输出路径,大小的相关资料,需要的朋友可以参考
  • c c++ c语言遍历文件夹 c语言读文件 c语言写文件
  • Linux C语言遍历文件夹

    2016-05-23 21:25:11
    #include #include #include void List(char *path) { printf("路径为[%s]\n", path); struct dirent* ent = NULL; DIR *pDir;... //d_reclen:16表示子目录或以.开头的隐藏文件,24表示普通文本文
  • 注:本文讨论的是怎么用Windows API遍历目录所有文件。除Windows API,还有一种Windows/Linux通用的方式,使用。WIN32_FIND_DATA结构遍历目录文件需要用到WIN32_FIND_DATA结构。实际上有两种结构:WIN32_...
  • #include <stdio.h> #include<io.h> #include<string.h>...//文件夹遍历函数 void Connect(char*,char*,char*);//字符串连接函数 void main() { char a[50]=""; char b[5]="\\*.*...
  • =NULL) { /* 给文件或目录名添加路径:argv[1]+"/"+direntp->d_name */ char dirbuf[512]; memset(dirbuf,0,sizeof(dirbuf)); strcpy(dirbuf,path); strcat(dirbuf,"/"); strcat(dirbuf,direntp->d_name); if(strstr...
  • /**linux 下遍历文件夹以及获取文件大小*/#include #include #include #include /** 获取文件大小,但是文件大小不能超过2G ,该方法不推荐使用 */unsigned long get_file_size_small(const char *filename){FILE *...
  • #include #include #include #include ...//遍历文件夹的驱动函数 void List_Files(const char *path); //遍历文件夹de递归函数 void List_Files_Core(const char *path, int recursive); int main(in

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,579
精华内容 3,431
关键字:

c语言遍历文件夹下所有文件

c语言 订阅