获取文件夹下的所有文件名 (linux windows)

2021-03-03 15:28

阅读:637

标签:add   ack   stl   back   sig   app   orm   else   pes   

windows下获取文件夹下的所有文件名

 

 1 #include "folder.hpp"
 2 #include  3 
 4 void getFilesFromFolder(const string strpath,vectorstring> &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  2 #include  3 #include  4 #include  5 
 6 using namespace std;
 7 
 8 void getFilesFromFolder(const string& folderName,vectorstring>& 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函数进行排序

获取文件夹下的所有文件名 (linux windows)

标签:add   ack   stl   back   sig   app   orm   else   pes   

原文地址:https://www.cnblogs.com/peimingzhang/p/12951464.html


评论


亲,登录后才可以留言!