C++ 获取文件夹下的所有文件名

来源:互联网 发布:优化游戏的软件 编辑:程序博客网 时间:2024/06/05 02:55

转载   C++ 获取文件夹下的所有文件名 

获取文件夹下所有的文件名是常用的功能,今天再一次有这样的需求,所有就在网上查找了很多,并记下以供后用。

原文:http://blog.csdn.NET/cxf7394373/article/details/7195661

原文:http://qiaoxinwang.blog.163.com/blog/static/86096452010612139172/

头文件:#include<io.h>

 

  char * filePath = "D:\\sample" 


 vector<string> files;        ////获取该路径下的所有文件    getFiles(filePath, files );        char str[30];    int size = files.size();    for (int i = 0;i < size;i++)    {       cout<<files[i].c_str()<<endl;   }  

 
 void getFiles( string path, vector<string>& files )   {       //文件句柄       long   hFile   =   0;       //文件信息       struct _finddata_t fileinfo;       string p;       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)                       getFiles( p.assign(path).append("\\").append(fileinfo.name), files );               }               else               {                   files.push_back(p.assign(path).append("\\").append(fileinfo.name) );               }           }while(_findnext(hFile, &fileinfo)  == 0);           _findclose(hFile);       }   }  

_finddata_t 的使用
那么到底如何查找文件呢?我们需要一个结构体和几个大家可能不太熟悉的函数。这些函数和结构体在<io.h>的头文件中,结构体为struct _finddata_t ,函数为_findfirst、_findnext和_fineclose。具体如何使用,我会慢慢讲来~

首先讲这个结构体吧~ struct _finddata_t ,这个结构体是用来存储文件各种信息的。说实话,这个结构体的具体定义代码,我没有找到,不过还好,文档里面在_find里有比较详细的成员变量介绍。我基本上就把文档翻译过来讲吧:


unsigned atrrib:文件属性的存储位置。它存储一个unsigned单元,用于表示文件的属性。文件属性是用位表示的,主要有以下一些:_A_ARCH(存档)、_A_HIDDEN(隐藏)、_A_NORMAL(正常)、_A_RDONLY(只读)、_A_SUBDIR(文件夹)、_A_SYSTEM(系统)。

这些都是在<io.h>中定义的宏,可以直接使用,而本身的意义其实是一个无符号整型(只不过这个整型应该是2的几次幂,从而保证只有一位为1,而其他位为0)。既然是位表示,那么当一个文件有多个属性时,它往往是通过位或的方式,来得到几个属性的综合。例如只读+隐藏+系统属性,应该为:_A_HIDDEN | _A_RDONLY | _A_SYSTEM 。
time_t time_create:这里的time_t是一个变量类型(长整型?相当于long int?),用来存储时间的,我们暂时不用理它,只要知道,这个time_create变量是用来存储文件创建时间的就可以了。
time_t time_access:文件最后一次被访问的时间。
time_t time_write:文件最后一次被修改的时间。
_fsize_t size:文件的大小。这里的_fsize_t应该可以相当于unsigned整型,表示文件的字节数。
char name[_MAX_FNAME]:文件的文件名。这里的_MAX_FNAME是一个常量宏,它在<stdlib.h>头文件中被定义,表示的是文件名的最大长度。
以此,我们可以推测出,struct _finddata_t ,大概的定义如下:


 struct _finddata_t {              unsigned attrib;              time_t time_create;              time_t time_access;              time_t time_write;              _fsize_t size;              char name[_MAX_FNAME]; };

        前面也说了,这个结构体是用来存储文件信息的,那么如何把一个硬盘文件的文件信息“存到”这个结构体所表示的内存空间里去呢?这就要靠_findfirst、_findnext和_fineclose三个函数的搭配使用了。

        首先还是对这三个函数一一介绍一番吧……

        long _findfirst( char *filespec, struct _finddata_t *fileinfo );

        返回值:如果查找成功的话,将返回一个long型的唯一的查找用的句柄(就是一个唯一编号)。这个句柄将在_findnext函数中被使用。若失败,则返回-1。

        参数:

        filespec:标明文件的字符串,可支持通配符。比如:*.c,则表示当前文件夹下的所有后缀为C的文件。

        fileinfo :这里就是用来存放文件信息的结构体的指针。这个结构体必须在调用此函数前声明,不过不用初始化,只要分配了内存空间就可以了。函数成功后,函数会把找到的文件的信息放入这个结构体中。

        int _findnext( long handle, struct _finddata_t *fileinfo );

        返回值:若成功返回0,否则返回-1。

        参数:

        handle:即由_findfirst函数返回回来的句柄。

        fileinfo:文件信息结构体的指针。找到文件后,函数将该文件信息放入此结构体中。

        int _findclose( long handle );

        返回值:成功返回0,失败返回-1。

        参数:

        handle :_findfirst函数返回回来的句柄。

        大家看到这里,估计都能猜到个大概了吧?先用_findfirst查找第一个文件,若成功则用返回的句柄调用_findnext函数查找其他的文件,当查找完毕后用,用_findclose函数结束查找。恩,对,这就是正确思路。下面我们就按照这样的思路来编写一个查找C:\WINDOWS文件夹下的所有exe可执行文件的程序。

 #include <stdio.h>         #include <io.h>          const char *to_search="C:\\WINDOWS\\*.exe";        //欲查找的文件,支持通配符          int main()         {              long handle;                                                //用于查找的句柄              struct _finddata_t fileinfo;                          //文件信息的结构体              handle=_findfirst(to_search,&fileinfo);         //第一次查找              if(-1==handle)return -1;              printf("%s\n",fileinfo.name);                         //打印出找到的文件的文件名              while(!_findnext(handle,&fileinfo))               //循环查找其他符合的文件,知道找不到其他的为止              {                   printf("%s\n",fileinfo.name);             }              _findclose(handle);                                      //别忘了关闭句柄              system("pause");              return 0;         }


 当然,这个文件的查找是在指定的路径中进行,如何遍历硬盘,在整个硬盘中查找文件呢?大家可以在网络上搜索文件递归遍历等方法,这里不再做进一步介绍。



        细心的朋友可能会注意到我在程序的末尾用了一个system函数。这个与程序本身并没有影响,和以前介绍给大家的使用getchar()函数的作用相同,只是为了暂停一下,让我们能看到命令提示符上输出的结果而已。不过system函数本身是一个非常强大的函数。大家可以查查MSDN看看~ 简单来说,它是一个C语言与操作系统的相互平台,可以在程序里通过这个函数,向操作系统传递command命令

 

更多例子:

 

主要用到了以下几个头文件(类):io.h, fstream, string。
 
首先,读取某给定路径下所有文件夹与文件名称,并带完整路径。实现代码如下:

void getAllFiles( string path, vector<string>& files) {   //文件句柄   long  hFile  =  0;   //文件信息   struct _finddata_t fileinfo;   string p;   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) );          getFilesall( p.assign(path).append("\\").append(fileinfo.name), files );         }      }       else      {         files.push_back(p.assign(path).append("\\").append(fileinfo.name) );       }     }while(_findnext(hFile, &fileinfo) == 0);     _findclose(hFile);   } }


该函数有两个参数,第一个为路径字符串(string类型,最好为绝对路径);第二个参数为文件夹与文件名称存储变量(vector类型,引用传递)。
在主函数中调用格式(并将结果保存在文件"AllFiles.txt"中,第一行为总数):

char * filePath = "E:\\YunShi";vector<string> files; char * distAll = "AllFiles.txt";getFilesall(filePath, files);ofstream ofn(distAll);int size = files.size(); ofn<<size<<endl;for (int i = 0;i<size;i++) {  ofn<<files[i]<<endl;}ofn.close();


同理,只读取某给定路径下的当前文件夹名(以下类似,只给出函数,调用案例同上):

void getJustCurrentDir( string path, vector<string>& files)  {   //文件句柄   long  hFile  =  0;   //文件信息   struct _finddata_t fileinfo;   string p;    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(fileinfo.name);           //files.push_back(p.assign(path).append("\\").append(fileinfo.name) );         }                   }      }while(_findnext(hFile, &fileinfo) == 0);      _findclose(hFile);   } }


只读取某给定路径下的当前文件名:

void getJustCurrentFile( string path, vector<string>& files) {  //文件句柄  long  hFile  =  0;   //文件信息  struct _finddata_t fileinfo;  string p;   if((hFile = _findfirst(p.assign(path).append("\\*").c_str(),&fileinfo)) != -1)   {    do    {       if((fileinfo.attrib & _A_SUBDIR))       {        ;      }      else      {        files.push_back(fileinfo.name);        //files.push_back(p.assign(path).append("\\").append(fileinfo.name) );       }     }while(_findnext(hFile, &fileinfo) == 0);     _findclose(hFile);  }}


只读取某给定路径下的所有文件名(即包含当前目录及子目录的文件):

void getFilesAll( string path, vector<string>& files)  {   //文件句柄   long  hFile  =  0;    //文件信息   struct _finddata_t fileinfo;   string p;    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) );           getFilesA( p.assign(path).append("\\").append(fileinfo.name), files );          }       }       else       {         files.push_back(p.assign(path).append("\\").append(fileinfo.name) );        }     }while(_findnext(hFile, &fileinfo) == 0);      _findclose(hFile);   } }



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 9个月孩子不吃辅食怎么办 y一夜没有睡好现在母乳不够怎么办 喂母乳的婴儿总要吃奶怎么办 宝宝四个月了奶水不够吃怎么办 宝宝出生十天了奶水不够吃怎么办 宝宝晚上不吃奶了奶水多怎么办 我家小孩六个月了奶不够吃怎么办 六个月的宝宝奶不够吃怎么办 宝贝六个月了奶不够吃怎么办 奶不够吃宝宝又不吃奶粉怎么办 婴儿到新环境哭闹不睡觉怎么办 婴儿到陌生地方狂哭不止怎么办 在家里遇到有人有陌生人敲门怎么办 在家里晚上睡觉遇到持刀小偷怎么办 在租房中房东随意调换房间怎么办 梦见熟人当面说我坏话偷东西怎么办 偷了家里的存折拿了钱该怎么办 故意让小偷偷车捉住他怎么办 进屋门正对着厕所门怎么办 楼房对面门上放个镜子我该怎么办 从顺丰发的水果坏了顺丰不管怎么办 汽车塑料件被机头水腐蚀了怎么办 孕期吃了炒菜里面加的香精怎么办 五个月宝宝只长身高不长体重怎么办 孩子6个月奶水越来越少怎么办 孩子快三个月了奶水越来越少怎么办 老婆生完孩子乳房肿胀不下奶怎么办 大人吃了退烧药不出汗怎么办 三岁宝宝抵抗力差总生病怎么办 8个月宝宝发烧39度怎么办 小孩发烧吃了药不退烧怎么办 小孩一直发烧39度左右不退怎么办 九个月宝宝反复发烧39度怎么办 八个月宝宝反复发烧39度怎么办 十个月宝宝反复发烧39度怎么办 2岁宝宝反复发烧怎么办39度左右 宝宝两周岁光吃水果不吃饭怎么办 3岁宝宝光吃水果不吃饭怎么办 中学生就爱玩儿游戏不爱学习怎么办 一岁宝宝只吃水果不吃饭怎么办 孩子发烧咳嗽怎么办最有效的方法