獲取文件夾下的所有文件名 (linux windows)


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函數進行排序


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM