C++遍歷文件夾下所有文件的多種方法
為數(shù)不多的好用的代碼,遍歷文件夾獲取所有子文件名,"filespec"可用通配符“*?”。注意如果用相對(duì)路徑的話,獲取所有文件名后應(yīng)再調(diào)用SetInitDir將初始目錄改為當(dāng)前目錄,否則中間生成的文件都會(huì)放在之前的“InitDir”內(nèi)。
C/C++遍歷文件夾感覺(jué)真是很不好用,建議還是使用C/C++做單任務(wù)處理,然后通過(guò)腳本語(yǔ)言實(shí)現(xiàn)遍歷比較合理。
CBrowseDir.h
#include <io.h>
#include <stdlib.h>
#include <direct.h>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class CBrowseDir
{
protected:
//存放初始目錄的絕對(duì)路徑,以'\'結(jié)尾
char m_szInitDir[_MAX_PATH];
public:
//缺省構(gòu)造器
CBrowseDir();
//設(shè)置初始目錄為dir,如果返回false,表示目錄不可用
bool SetInitDir(const char *dir);
//開(kāi)始遍歷初始目錄及其子目錄下由filespec指定類型的文件
//filespec可以使用通配符 * ?,不能包含路徑。
//如果返回false,表示遍歷過(guò)程被用戶中止
bool BeginBrowse(const char *filespec);
vector<string> BeginBrowseFilenames(const char *filespec);
protected:
//遍歷目錄dir下由filespec指定的文件
//對(duì)于子目錄,采用迭代的方法
//如果返回false,表示中止遍歷文件
bool BrowseDir(const char *dir,const char *filespec);
vector<string> GetDirFilenames(const char *dir,const char *filespec);
//函數(shù)BrowseDir每找到一個(gè)文件,就調(diào)用ProcessFile
//并把文件名作為參數(shù)傳遞過(guò)去
//如果返回false,表示中止遍歷文件
//用戶可以覆寫(xiě)該函數(shù),加入自己的處理代碼
virtual bool ProcessFile(const char *filename);
//函數(shù)BrowseDir每進(jìn)入一個(gè)目錄,就調(diào)用ProcessDir
//并把正在處理的目錄名及上一級(jí)目錄名作為參數(shù)傳遞過(guò)去
//如果正在處理的是初始目錄,則parentdir=NULL
//用戶可以覆寫(xiě)該函數(shù),加入自己的處理代碼
//比如用戶可以在這里統(tǒng)計(jì)子目錄的個(gè)數(shù)
virtual void ProcessDir(const char *currentdir,const char *parentdir);
};
CBrowseDir.cpp
#include "CBrowseDir.h"
CBrowseDir::CBrowseDir()
{
//用當(dāng)前目錄初始化m_szInitDir
getcwd(m_szInitDir,_MAX_PATH);
//如果目錄的最后一個(gè)字母不是'\',則在最后加上一個(gè)'\'
int len=strlen(m_szInitDir);
if (m_szInitDir[len-1] != '\\')
strcat(m_szInitDir,"\\");
}
bool CBrowseDir::SetInitDir(const char *dir)
{
//先把dir轉(zhuǎn)換為絕對(duì)路徑
if (_fullpath(m_szInitDir,dir,_MAX_PATH) == NULL)
return false;
//判斷目錄是否存在
if (_chdir(m_szInitDir) != 0)
return false;
//如果目錄的最后一個(gè)字母不是'\',則在最后加上一個(gè)'\'
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
{
//檢查是不是目錄
//如果不是,則進(jìn)行處理
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中的子目錄
//因?yàn)樵谔幚韉ir中的文件時(shí),派生類的ProcessFile有可能改變了
//當(dāng)前目錄,因此還要重新設(shè)置當(dāng)前目錄為dir。
//執(zhí)行過(guò)_findfirst后,可能系統(tǒng)記錄下了相關(guān)信息,因此改變目錄
//對(duì)_findnext沒(méi)有影響。
_chdir(dir);
if ((hFile=_findfirst("*.*",&fileinfo)) != -1)
{
do
{
//檢查是不是目錄
//如果是,再檢查是不是 . 或 ..
//如果不是,進(jìn)行迭代
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
{
//檢查是不是目錄
//如果不是,則進(jìn)行處理
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中的子目錄
//因?yàn)樵谔幚韉ir中的文件時(shí),派生類的ProcessFile有可能改變了
//當(dāng)前目錄,因此還要重新設(shè)置當(dāng)前目錄為dir。
//執(zhí)行過(guò)_findfirst后,可能系統(tǒng)記錄下了相關(guān)信息,因此改變目錄
//對(duì)_findnext沒(méi)有影響。
_chdir(dir);
if ((hFile=_findfirst("*.*",&fileinfo)) != -1)
{
do
{
//檢查是不是目錄
//如果是,再檢查是不是 . 或 ..
//如果不是,進(jìn)行迭代
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)
{
}
實(shí)現(xiàn)方法二、
數(shù)據(jù)分多個(gè)文件存儲(chǔ),讀取數(shù)據(jù)就需要對(duì)多個(gè)文件進(jìn)行操作。首先就需要定位到文件的名字,之后再對(duì)文件進(jìn)行相應(yīng)的讀寫(xiě)操作。多次涉及多文件的讀寫(xiě)操作,現(xiàn)將這個(gè)實(shí)現(xiàn)總結(jié)一下,方便自己和他人使用。具體代碼如下:
#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 //最長(zhǎng)路徑長(zhǎng)度
/*----------------------------
* 功能 : 遞歸遍歷文件夾,找到其中包含的所有文件
*----------------------------
* 函數(shù) : find
* 訪問(wèn) : public
*
* 參數(shù) : lpPath [in] 需遍歷的文件夾目錄
* 參數(shù) : fileList [in] 以文件名稱的形式存儲(chǔ)遍歷后的文件
*/
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;//定義一個(gè)存放結(jié)果文件名稱的鏈表
//遍歷一次結(jié)果的所有文件,獲取文件名列表
find("XXXX具體文件夾目錄",fileList);//之后可對(duì)文件列表中的文件進(jìn)行相應(yīng)的操作
//輸出文件夾下所有文件的名稱
for(int i = 0; i < fileList.size(); i++)
{
cout << fileList[i] << endl;
}
cout << "文件數(shù)目:" << fileList.size() << endl;
return 0;
}
測(cè)試了一下,目標(biāo)文件夾下的文件名稱存在了fileList容器中,根據(jù)讀取的文件名稱,可對(duì)文件進(jìn)行相應(yīng)的操作,輸出結(jié)果如下所示:

c++ 遍歷目錄下文件方法三
function:遍歷目錄下所有文件,返回文件總數(shù),子文件夾總數(shù)(修改一下可以獲得全部文件名等)。
#include "stdlib.h"
#include "direct.h"
#include "string.h"
#include "io.h"
#include "stdio.h"
#include "iostream"
using namespace std;
class CBrowseDir
{
protected:
//存放初始目錄的絕對(duì)路徑,以'\'結(jié)尾
char m_szInitDir[_MAX_PATH];
public:
//缺省構(gòu)造器
CBrowseDir();
//設(shè)置初始目錄為dir,如果返回false,表示目錄不可用
bool SetInitDir(const char *dir);
//開(kāi)始遍歷初始目錄及其子目錄下由filespec指定類型的文件
//filespec可以使用通配符 * ?,不能包含路徑。
//如果返回false,表示遍歷過(guò)程被用戶中止
bool BeginBrowse(const char *filespec);
protected:
//遍歷目錄dir下由filespec指定的文件
//對(duì)于子目錄,采用迭代的方法
//如果返回false,表示中止遍歷文件
bool BrowseDir(const char *dir,const char *filespec);
//函數(shù)BrowseDir每找到一個(gè)文件,就調(diào)用ProcessFile
//并把文件名作為參數(shù)傳遞過(guò)去
//如果返回false,表示中止遍歷文件
//用戶可以覆寫(xiě)該函數(shù),加入自己的處理代碼
virtual bool ProcessFile(const char *filename);
//函數(shù)BrowseDir每進(jìn)入一個(gè)目錄,就調(diào)用ProcessDir
//并把正在處理的目錄名及上一級(jí)目錄名作為參數(shù)傳遞過(guò)去
//如果正在處理的是初始目錄,則parentdir=NULL
//用戶可以覆寫(xiě)該函數(shù),加入自己的處理代碼
//比如用戶可以在這里統(tǒng)計(jì)子目錄的個(gè)數(shù)
virtual void ProcessDir(const char *currentdir,const char *parentdir);
};
CBrowseDir::CBrowseDir()
{
//用當(dāng)前目錄初始化m_szInitDir
getcwd(m_szInitDir,_MAX_PATH);
//如果目錄的最后一個(gè)字母不是'\',則在最后加上一個(gè)'\'
int len=strlen(m_szInitDir);
if (m_szInitDir[len-1] != '\\')
strcat(m_szInitDir,"\\");
}
bool CBrowseDir::SetInitDir(const char *dir)
{
//先把dir轉(zhuǎn)換為絕對(duì)路徑
if (_fullpath(m_szInitDir,dir,_MAX_PATH) == NULL)
return false;
//判斷目錄是否存在
if (_chdir(m_szInitDir) != 0)
return false;
//如果目錄的最后一個(gè)字母不是'\',則在最后加上一個(gè)'\'
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
{
//檢查是不是目錄
//如果不是,則進(jìn)行處理
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中的子目錄
//因?yàn)樵谔幚韉ir中的文件時(shí),派生類的ProcessFile有可能改變了
//當(dāng)前目錄,因此還要重新設(shè)置當(dāng)前目錄為dir。
//執(zhí)行過(guò)_findfirst后,可能系統(tǒng)記錄下了相關(guān)信息,因此改變目錄
//對(duì)_findnext沒(méi)有影響。
_chdir(dir);
if ((hFile=_findfirst("*.*",&fileinfo)) != -1)
{
do
{
//檢查是不是目錄
//如果是,再檢查是不是 . 或 ..
//如果不是,進(jìn)行迭代
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派生出的子類,用來(lái)統(tǒng)計(jì)目錄中的文件及子目錄個(gè)數(shù)
class CStatDir:public CBrowseDir
{
protected:
int m_nFileCount; //保存文件個(gè)數(shù)
int m_nSubdirCount; //保存子目錄個(gè)數(shù)
public:
//缺省構(gòu)造器
CStatDir()
{
//初始化數(shù)據(jù)成員m_nFileCount和m_nSubdirCount
m_nFileCount=m_nSubdirCount=0;
}
//返回文件個(gè)數(shù)
int GetFileCount()
{
return m_nFileCount;
}
//返回子目錄個(gè)數(shù)
int GetSubdirCount()
{
//因?yàn)檫M(jìn)入初始目錄時(shí),也會(huì)調(diào)用函數(shù)ProcessDir,
//所以減1后才是真正的子目錄個(gè)數(shù)。
return m_nSubdirCount-1;
}
protected:
//覆寫(xiě)虛函數(shù)ProcessFile,每調(diào)用一次,文件個(gè)數(shù)加1
virtual bool ProcessFile(const char *filename)
{
m_nFileCount++;
return CBrowseDir::ProcessFile(filename);
}
//覆寫(xiě)虛函數(shù)ProcessDir,每調(diào)用一次,子目錄個(gè)數(shù)加1
virtual void ProcessDir
(const char *currentdir,const char *parentdir)
{
m_nSubdirCount++;
CBrowseDir::ProcessDir(currentdir,parentdir);
}
};
void main()
{
//獲取目錄名
char buf[256];
printf("請(qǐng)輸入要統(tǒng)計(jì)的目錄名:");
gets(buf);
//構(gòu)造類對(duì)象
CStatDir statdir;
//設(shè)置要遍歷的目錄
if (!statdir.SetInitDir(buf))
{
puts("目錄不存在。");
return;
}
//開(kāi)始遍歷
statdir.BeginBrowse("*.*");
printf("文件總數(shù): %d\n子目錄總數(shù):%d\n",statdir.GetFileCount(),statdir.GetSubdirCount());
}
已在windows上驗(yàn)證有效。
下面我加了BeginBrowseFilenames函數(shù),以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:
//存放初始目錄的絕對(duì)路徑,以'\'結(jié)尾
char m_szInitDir[_MAX_PATH];
public:
//缺省構(gòu)造器
CBrowseDir();
//設(shè)置初始目錄為dir,如果返回false,表示目錄不可用
bool SetInitDir(const char *dir);
//開(kāi)始遍歷初始目錄及其子目錄下由filespec指定類型的文件
//filespec可以使用通配符 * ?,不能包含路徑。
//如果返回false,表示遍歷過(guò)程被用戶中止
bool BeginBrowse(const char *filespec);
vector<string> BeginBrowseFilenames(const char *filespec);
protected:
//遍歷目錄dir下由filespec指定的文件
//對(duì)于子目錄,采用迭代的方法
//如果返回false,表示中止遍歷文件
bool BrowseDir(const char *dir,const char *filespec);
vector<string> GetDirFilenames(const char *dir,const char *filespec);
//函數(shù)BrowseDir每找到一個(gè)文件,就調(diào)用ProcessFile
//并把文件名作為參數(shù)傳遞過(guò)去
//如果返回false,表示中止遍歷文件
//用戶可以覆寫(xiě)該函數(shù),加入自己的處理代碼
virtual bool ProcessFile(const char *filename);
//函數(shù)BrowseDir每進(jìn)入一個(gè)目錄,就調(diào)用ProcessDir
//并把正在處理的目錄名及上一級(jí)目錄名作為參數(shù)傳遞過(guò)去
//如果正在處理的是初始目錄,則parentdir=NULL
//用戶可以覆寫(xiě)該函數(shù),加入自己的處理代碼
//比如用戶可以在這里統(tǒng)計(jì)子目錄的個(gè)數(shù)
virtual void ProcessDir(const char *currentdir,const char *parentdir);
};
CBrowseDir::CBrowseDir()
{
//用當(dāng)前目錄初始化m_szInitDir
getcwd(m_szInitDir,_MAX_PATH);
//如果目錄的最后一個(gè)字母不是'\',則在最后加上一個(gè)'\'
int len=strlen(m_szInitDir);
if (m_szInitDir[len-1] != '\\')
strcat(m_szInitDir,"\\");
}
bool CBrowseDir::SetInitDir(const char *dir)
{
//先把dir轉(zhuǎn)換為絕對(duì)路徑
if (_fullpath(m_szInitDir,dir,_MAX_PATH) == NULL)
return false;
//判斷目錄是否存在
if (_chdir(m_szInitDir) != 0)
return false;
//如果目錄的最后一個(gè)字母不是'\',則在最后加上一個(gè)'\'
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
{
//檢查是不是目錄
//如果不是,則進(jìn)行處理
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中的子目錄
//因?yàn)樵谔幚韉ir中的文件時(shí),派生類的ProcessFile有可能改變了
//當(dāng)前目錄,因此還要重新設(shè)置當(dāng)前目錄為dir。
//執(zhí)行過(guò)_findfirst后,可能系統(tǒng)記錄下了相關(guān)信息,因此改變目錄
//對(duì)_findnext沒(méi)有影響。
_chdir(dir);
if ((hFile=_findfirst("*.*",&fileinfo)) != -1)
{
do
{
//檢查是不是目錄
//如果是,再檢查是不是 . 或 ..
//如果不是,進(jìn)行迭代
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
{
//檢查是不是目錄
//如果不是,則進(jìn)行處理
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中的子目錄
//因?yàn)樵谔幚韉ir中的文件時(shí),派生類的ProcessFile有可能改變了
//當(dāng)前目錄,因此還要重新設(shè)置當(dāng)前目錄為dir。
//執(zhí)行過(guò)_findfirst后,可能系統(tǒng)記錄下了相關(guān)信息,因此改變目錄
//對(duì)_findnext沒(méi)有影響。
_chdir(dir);
if ((hFile=_findfirst("*.*",&fileinfo)) != -1)
{
do
{
//檢查是不是目錄
//如果是,再檢查是不是 . 或 ..
//如果不是,進(jìn)行迭代
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派生出的子類,用來(lái)統(tǒng)計(jì)目錄中的文件及子目錄個(gè)數(shù)
class CStatDir:public CBrowseDir
{
protected:
int m_nFileCount; //保存文件個(gè)數(shù)
int m_nSubdirCount; //保存子目錄個(gè)數(shù)
public:
//缺省構(gòu)造器
CStatDir()
{
//初始化數(shù)據(jù)成員m_nFileCount和m_nSubdirCount
m_nFileCount=m_nSubdirCount=0;
}
//返回文件個(gè)數(shù)
int GetFileCount()
{
return m_nFileCount;
}
//返回子目錄個(gè)數(shù)
int GetSubdirCount()
{
//因?yàn)檫M(jìn)入初始目錄時(shí),也會(huì)調(diào)用函數(shù)ProcessDir,
//所以減1后才是真正的子目錄個(gè)數(shù)。
return m_nSubdirCount-1;
}
protected:
//覆寫(xiě)虛函數(shù)ProcessFile,每調(diào)用一次,文件個(gè)數(shù)加1
virtual bool ProcessFile(const char *filename)
{
m_nFileCount++;
return CBrowseDir::ProcessFile(filename);
}
//覆寫(xiě)虛函數(shù)ProcessDir,每調(diào)用一次,子目錄個(gè)數(shù)加1
virtual void ProcessDir
(const char *currentdir,const char *parentdir)
{
m_nSubdirCount++;
CBrowseDir::ProcessDir(currentdir,parentdir);
}
};
void main()
{
//獲取目錄名
char buf[256];
printf("請(qǐng)輸入要統(tǒng)計(jì)的目錄名:");
gets(buf);
//構(gòu)造類對(duì)象
CStatDir statdir;
//設(shè)置要遍歷的目錄
if (!statdir.SetInitDir(buf))
{
puts("目錄不存在。");
return;
}
//開(kāi)始遍歷
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("文件總數(shù): %d\n",file_vec.size());
system("pause");
}
方法四、C++讀取某個(gè)文件夾下面的子文件夾及其所有文件
下面是輸出當(dāng)前目錄下的所有文件夾以及文件的絕對(duì)路徑(當(dāng)然也可以是相對(duì)路徑,由輸入的路徑?jīng)Q定),下面的函數(shù)接口可以改裝為單輸出文件或者文件夾的接口,這是一個(gè)大方面的總接口。
#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; //很少用的文件信息讀取結(jié)構(gòu)
string p; //string類很有意思的一個(gè)賦值函數(shù):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);//遞歸當(dāng)前文件夾
}
}
else //文件處理
{
files.push_back(p.assign(path).append("/").append(fileinfo.name));//文件名
}
} while (_findnext(hFile, &fileinfo) == 0); //尋找下一個(gè),成功返回0,否則-1
_findclose(hFile);
}
}
//測(cè)試
void main()
{
string DATA_DIR = "D:/CoderMaker/data_sets/lfw";
vector<string> files;
//測(cè)試
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è)試結(jié)果

相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)宿舍管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)宿舍管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
VS+QT編譯環(huán)境中字符亂碼問(wèn)題解決方法
編碼就是把?個(gè)字符編碼成二進(jìn)制碼存起來(lái)的方式,而解碼就是把這個(gè)二進(jìn)制碼按照原本編碼的規(guī)則還原成原來(lái)的字符,這篇文章主要介紹了VS+QT編譯環(huán)境中字符亂碼問(wèn)題詳解,需要的朋友可以參考下2024-01-01
C++中volatile關(guān)鍵字的使用詳解以及常見(jiàn)的誤解
volatile 關(guān)鍵字是一種類型修飾符,用它聲明的類型變量表示可以被某些編譯器未知的因素更改,比如:操作系統(tǒng),硬件或者其他線程等2020-01-01
C++11用兩個(gè)線程輪流打印整數(shù)的實(shí)現(xiàn)方法
這篇文章主要介紹了C++11用兩個(gè)線程輪流打印整數(shù)的實(shí)現(xiàn)方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
C++如何調(diào)用opencv完成運(yùn)動(dòng)目標(biāo)捕捉詳解
OpenCV作為機(jī)器視覺(jué)開(kāi)源庫(kù),使用起來(lái)非常不錯(cuò),這篇文章主要給大家介紹了關(guān)于C++如何調(diào)用opencv完成運(yùn)動(dòng)目標(biāo)捕捉的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05
C++實(shí)現(xiàn)日期計(jì)算器詳細(xì)代碼示例
這篇文章主要給大家介紹了關(guān)于C++實(shí)現(xiàn)日期計(jì)算器的相關(guān)資料,基于C++編寫(xiě)的簡(jiǎn)單的日期計(jì)算器,供大家參考,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-03-03
C++11右值引用和std::move語(yǔ)句實(shí)例解析(推薦)
右值引用(及其支持的Move語(yǔ)意和完美轉(zhuǎn)發(fā))是C++0x將要加入的最重大語(yǔ)言特性之一。這篇文章主要介紹了C++11右值引用和std::move語(yǔ)句實(shí)例解析,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03

