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容器中,根据读取的文件名称,可对文件进行相应的操作,输出结果如下所示:

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

方法四、C++读取某个文件夹下面的子文件夹及其所有文件

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

#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++遍历文件夹下的所有文件
  • Python与C++ 遍历文件夹下的所有图片实现代码
  • C++遍历文件夹获取文件列表
  • C++遍历文件夹下文件的方法
(0)

相关推荐

  • C++遍历文件夹下的所有文件

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

  • Python与C++ 遍历文件夹下的所有图片实现代码

     Pyhton与C++ 遍历文件夹下的所有图片实现代码 前言 虽然本文说的是遍历图片,但是遍历其他文件也是可以的. 在进行图像处理的时候,大部分时候只需要处理单张图片.但是一旦把图像处理和机器学习相结合,或者做一些稍大一些的任务的时候,常常需要处理好多图片.而这里面,一个最基本的问题就是如何遍历这些图片. 用OpenCV做过人脸识别的人应该知道,那个项目中并没有进行图片的遍历,而是用了一种辅助方案,生成了一个包含所有图片路径的文件at.txt,然后通过这个路径来读取所有图片.而且这个辅助文件不仅

  • C++遍历文件夹获取文件列表

    本文实例类似遍历一个文件夹然后获得该文件夹下的文件列表,可以随意切换文件目录,本来是用在我们小组写的简易ftp服务器上的一个给客户端显示的一个小插件,总之单拿出来应该没啥含量,调用了windows的一些API. 实例代码: #include<iostream> #include<stdlib.h> #include<windows.h> #include<fstream> #include<stdio.h> #include<vector&

  • C++遍历文件夹下文件的方法

    本文实例讲述了C++遍历文件夹下文件的方法.分享给大家供大家参考.具体如下: #include <windows.h> #include <stdio.h> #include <string.h> #define LEN 1024 // 深度优先递归遍历目录中所有的文件 BOOL DirectoryList(LPCSTR Path) { WIN32_FIND_DATA FindData; HANDLE hError; int FileCount = 0; char Fi

  • PHP 遍历XP文件夹下所有文件

    复制代码 代码如下: <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <?php //PHP遍历文件夹下所有文件 $handle=opendir('C:\\'); //我要遍历C盘的文件 echo "目录 handle: $handle <br/>"; echo "文件: <br/>"; whi

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

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

  • java中File类应用遍历文件夹下所有文件

    本文要求遍历指定文件夹下的所有文件,包括子文件夹下的文件,供大家参考,具体内容如下 代码: package 遍历文件夹所有文件; import java.io.File; public class Test { public static void main(String[] args){ File file=new File("D:\\tcb\\周总结"); filesDirs(file); } //使用递归遍历文件夹及子文件夹中文件 public static void files

  • PHP使用glob方法遍历文件夹下所有文件的实例

    遍历文件夹下所有文件,一般可以使用opendir 与 readdir 方法来遍历. <?php $path = dirname(__FILE__); $result = traversing($path); print_r($result); function traversing($path){ $result = array(); if($handle = opendir($path)){ while($file=readdir($handle)){ if($file!='.' &&am

  • C++ 遍历某个文件夹下所有文件的方法步骤

    本文主要介绍了C++ 遍历某个文件夹下所有文件的方法步骤,分享给大家,主要给自己留个笔记.. #include<iostream> #include<string> #include<io.h> #include<cstdio> #include<cstdlib> #include<cstring> using namespace std; void fileSearch(string path) { long hFile = 0;

  • Java遍历文件夹下所有文件并重新命名

    本文实例为大家分享了Java遍历文件夹下所有文件并重命名的具体代码,供大家参考,具体内容如下 项目中需要将一批文件全部重新命名,文件实在太多就写了这个工具类 这个工具类是将路径下的文件全部重新命名,且名字为同一个 package com.xingli.FileDemo; import java.io.File; /** *@ClassName FileDemo *@Description TODO *@Author William *@Date 2019/8/8 14:51 *@Version

  • Java实现的模糊匹配某文件夹下的文件并删除功能示例

    本文实例讲述了Java实现的模糊匹配某文件夹下的文件并删除功能.分享给大家供大家参考,具体如下: package com.wyebd.gis; import java.io.File; /** * @Title: DelFiles.java * @Package com.wyebd.gis * @Description: * @author lisr * @date Mar 7, 2012 5:36:03 PM * @version V1.0 */ public class DelFiles {

  • linux 打包当前文件夹下所有文件的方法

    如下所示: tar czvf test.tar.gz *         #压缩当前文件夹下非隐藏文件的文件 tar czvf test.tar.gz  .[!.]*   #压缩当前文件夹下隐藏文件排除两个隐藏文件夹"."和".." tar zcvf test.tar  #`ls -a` 以上这篇linux 打包当前文件夹下所有文件的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们. 您可能感兴趣的文章: linux中tar打包指定路

  • java实现读取、删除文件夹下的文件

    java实现读取.删除文件夹下的文件 package test.com; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; public class ReadFile { public ReadFile() { } /** * 读取某个文件夹下的所有文件 */ public static boolean readfile(String filepath) throws Fi

  • PHP实现批量重命名某个文件夹下所有文件的方法

    本文实例讲述了PHP实现批量重命名某个文件夹下所有文件的方法.分享给大家供大家参考,具体如下: 自己手动这样一个个的重命名,累啊.所以还是偷懒一下. 我重命名的规则是把所有有空格的全部替换成"_",然后再后面加一个"_s". <?php $paths = "C://Documents and Settings//sk//Desktop//s//"; $d = dir($paths); while (false !== ($entry = $

随机推荐