windows下獲取文件夾下的所有文件名
1 #include "folder.hpp" 2 #include <io.h> 3 4 void getFilesFromFolder(const string strpath,vector<string> &vFile,const string strFileType) 5 { 6 intptr_t pHandle = 0; //文件句柄 7 struct _finddata_t stFileinfo; //文件信息 8 string strFolderName; //文件名 9 10 if ((pHandle = _findfirst(strFolderName.assign(strpath).append("\\*").c_str(), &stFileinfo)) != -1)//對指定路徑進行判斷 11 { 12 while (_findnext(pHandle, &stFileinfo) == 0)//遍歷文件夾下的文件 13 { 14 string strFileName = stFileinfo.name; 15 if ((stFileinfo.attrib & _A_SUBDIR))//判斷是否為文件夾 16 { 17 if (strFileName =="." && strFileName == ".." != 0)//排除當前目錄和上一級目錄 18 { 19 getFilesFromFolder(strFolderName.assign(strpath).append("\\").append(strFileName), vFile);//遞歸 20 } 21 } 22 else 23 { 24 if(strFileName.find(strFileType, 0)>=0)//將符合匹配要求的文件夾存起來 25 { vFile.push_back(strFolderName.assign(strpath).append("\\").append(strFileName)); } 26 } 27 } 28 _findclose(pHandle); 29 } 30 }
此處要包含頭文件io.h
在這里_findfirst函數可以指定查找指定的文件“*.*”就是查找所有文件,"*.cpp"就是查找所有cpp文件,我這里沒有這么寫,感興趣的小伙伴可以試試
_finddata_t結構體內包含了一些基本的文件信息
struct _finddata_t {
unsigned attrib; //所查找文件的屬性:_A_ARCH(存檔)、_A_HIDDEN(隱藏)、_A_NORMAL(正常)、_A_RDONLY(只讀)、 _A_SUBDIR(文件夾)、_A_SYSTEM(系統)。
time_t time_create; //創建文件的時間
time_t time_access; //最后一次訪問文件的時間
time_t time_write; //最后被修改的時間
_fsize_t size; //文件大小
char name[260]; //文件名
};
linux下獲取文件夾下的所有文件名
1 #include <stdlib.h> 2 #include <dirent.h> 3 #include <sys/stat.h> 4 #include <sys/types.h> 5 6 using namespace std; 7 8 void getFilesFromFolder(const string& folderName,vector<string>& vFiles,const string strFileType) 9 { 10 if (folderName.empty()) { return; } //字符串判斷 11 12 const int iRecursiveTimes = 3; //目標遞歸層數 13 static int s_iRecursiveTimes = 0; //當前遞歸層數 14 15 //文件夾判斷 16 struct stat stFolderStat; 17 stat(folderName.c_str(), &stFolderStat); 18 if (!S_ISDIR(stFolderStat.st_mode)) { return; } 19 20 DIR* open_dir = opendir(folderName.c_str()); 21 if (NULL == open_dir) { return; } //打開失敗 22 23 dirent* pDirent = NULL; 24 while( (pDirent = readdir(open_dir)) != NULL) { 25 struct stat stFileStata; 26 if (pDirent->d_name[0] != '.') { 27 string name = folderName+string("/")+string(pDirent->d_name); 28 stat(name.c_str(), &stFileStata); 29 30 if (S_ISDIR(stFileStata.st_mode)) {//是目錄就進行遞歸 31 if(iRecursiveTimes == s_iRecursiveTimes) { continue; } 32 else{ s_iRecursiveTimes++; } 33 getFilesFromFolder(name,vFiles,strFileType); 34 s_iRecursiveTimes--; 35 } 36 else if (S_ISREG(stFileStata.st_mode)) { 37 if(name.find(strFileType,0)>=0) { vFiles.push_back(name); } //進行類型判斷並保存文件名 38 //std::regex reg(strFileType); 39 //if(std::regex_search(name,reg)) { vFiles.push_back(name); } 40 } 41 } 42 } 43 closedir(open_dir); 44 }
此處要包含頭文件dirent.h sys/stat.h sys/types.h
這個linux下讀取文件名相比較上面windows下讀取文件名的方法使用了定義遞歸層數的方法,具體可以看注釋
ps:
一、為了方便進一步篩選我們想要的文件,這里為大家提供兩種篩選文件的方法:
1、stl string標准庫的find函數mystring.find(strKeywords,0)。
mystring是目標字符串、strKeywords是想匹配的關鍵字、0表示從第0個字符開始找,最后返回第一次出現關鍵字的位置,如果輸入空字符的關鍵字則返回0,沒有匹配的關鍵字就返回-1
2、用正則方式匹配字符。我注釋的地方為正則匹配的代碼
二、我這里輸入的路徑,最后的到的文件名帶路徑信息。這里大家可以靈活該程序,如果兩者都需要,這里為大家提供拆解的方法
windows下有專門的函數對路徑進行拆分,推薦這一篇博客https://blog.csdn.net/weixin_30677617/article/details/95149926
對於linux平台我沒有找到好辦法,有好辦法的小伙伴記得給我留言告訴我
一般方法是使用上面提到的string的find函數對“/”進行一步一步的拆分
三、一般情況下文件名是無序讀取的,就是說沒有按照文件名進行排序。
這里可以使用標准庫的sort函數進行排序