為數(shù)不多的好用的代碼,遍歷文件夾獲取所有子文件名,"filespec"可用通配符“*?”。注意如果用相對(duì)路徑的話,獲取所有文件名后應(yīng)再調(diào)用SetInitDir將初始目錄改為當(dāng)前目錄,否則中間生成的文件都會(huì)放在之前的“InitDir”內(nèi)。
C/C++遍歷文件夾感覺真是很不好用,建議還是使用C/C++做單任務(wù)處理,然后通過腳本語(yǔ)言實(shí)現(xiàn)遍歷比較合理。
創(chuàng)新互聯(lián)專注于林周網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供林周營(yíng)銷型網(wǎng)站建設(shè),林周網(wǎng)站制作、林周網(wǎng)頁(yè)設(shè)計(jì)、林周網(wǎng)站官網(wǎng)定制、小程序設(shè)計(jì)服務(wù),打造林周網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供林周網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。
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);
//開始遍歷初始目錄及其子目錄下由filespec指定類型的文件
//filespec可以使用通配符 * ?,不能包含路徑。
//如果返回false,表示遍歷過程被用戶中止
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ù)傳遞過去
//如果返回false,表示中止遍歷文件
//用戶可以覆寫該函數(shù),加入自己的處理代碼
virtual bool ProcessFile(const char *filename);
//函數(shù)BrowseDir每進(jìn)入一個(gè)目錄,就調(diào)用ProcessDir
//并把正在處理的目錄名及上一級(jí)目錄名作為參數(shù)傳遞過去
//如果正在處理的是初始目錄,則parentdir=NULL
//用戶可以覆寫該函數(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í)行過_findfirst后,可能系統(tǒng)記錄下了相關(guān)信息,因此改變目錄
//對(duì)_findnext沒有影響。
_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í)行過_findfirst后,可能系統(tǒng)記錄下了相關(guān)信息,因此改變目錄
//對(duì)_findnext沒有影響。
_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à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
* 訪問 : 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);
//開始遍歷初始目錄及其子目錄下由filespec指定類型的文件
//filespec可以使用通配符 * ?,不能包含路徑。
//如果返回false,表示遍歷過程被用戶中止
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ù)傳遞過去
//如果返回false,表示中止遍歷文件
//用戶可以覆寫該函數(shù),加入自己的處理代碼
virtual bool ProcessFile(const char *filename);
//函數(shù)BrowseDir每進(jìn)入一個(gè)目錄,就調(diào)用ProcessDir
//并把正在處理的目錄名及上一級(jí)目錄名作為參數(shù)傳遞過去
//如果正在處理的是初始目錄,則parentdir=NULL
//用戶可以覆寫該函數(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í)行過_findfirst后,可能系統(tǒng)記錄下了相關(guān)信息,因此改變目錄
//對(duì)_findnext沒有影響。
_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派生出的子類,用來統(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:
//覆寫虛函數(shù)ProcessFile,每調(diào)用一次,文件個(gè)數(shù)加1
virtual bool ProcessFile(const char *filename)
{
m_nFileCount++;
return CBrowseDir::ProcessFile(filename);
}
//覆寫虛函數(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;
}
//開始遍歷
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);
//開始遍歷初始目錄及其子目錄下由filespec指定類型的文件
//filespec可以使用通配符 * ?,不能包含路徑。
//如果返回false,表示遍歷過程被用戶中止
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ù)傳遞過去
//如果返回false,表示中止遍歷文件
//用戶可以覆寫該函數(shù),加入自己的處理代碼
virtual bool ProcessFile(const char *filename);
//函數(shù)BrowseDir每進(jìn)入一個(gè)目錄,就調(diào)用ProcessDir
//并把正在處理的目錄名及上一級(jí)目錄名作為參數(shù)傳遞過去
//如果正在處理的是初始目錄,則parentdir=NULL
//用戶可以覆寫該函數(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í)行過_findfirst后,可能系統(tǒng)記錄下了相關(guān)信息,因此改變目錄
//對(duì)_findnext沒有影響。
_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í)行過_findfirst后,可能系統(tǒng)記錄下了相關(guān)信息,因此改變目錄
//對(duì)_findnext沒有影響。
_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派生出的子類,用來統(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:
//覆寫虛函數(shù)ProcessFile,每調(diào)用一次,文件個(gè)數(shù)加1
virtual bool ProcessFile(const char *filename)
{
m_nFileCount++;
return CBrowseDir::ProcessFile(filename);
}
//覆寫虛函數(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;
}
//開始遍歷
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é)果

標(biāo)題名稱:C++遍歷文件夾下所有文件的多種方法
URL鏈接:http://www.chinadenli.net/article0/pgcsio.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、網(wǎng)站內(nèi)鏈、標(biāo)簽優(yōu)化、域名注冊(cè)、小程序開發(fā)、面包屑導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)