C++获取⽂件夹下的所有⽂件名
获取⽂件夹下所有的⽂件名是常⽤的功能,今天再⼀次有这样的需求,所有就在⽹上查了很多,并记下以供后⽤。
头⽂件:#include<io.h>
1char * filePath = "D:\\sample";
1 vector<string> files;
2
3////获取该路径下的所有⽂件
4 getFiles(filePath, files );
5
6char str[30];
7int size = files.size();
8for (int i = 0;i < size;i++)
9 {
10    cout<<files[i].c_str()<<endl;
11 }
1void getFiles( string path, vector<string>& files )
债权债务清理2 {
3//⽂件句柄
4long  hFile  =  0;
5//⽂件信息
6struct _finddata_t fileinfo;
7string p;
8if((hFile = _findfirst(p.assign(path).append("\\*").c_str(),&fileinfo)) !=  -1)
9    {
10do
11        {
12//如果是⽬录,迭代之
13//如果不是,加⼊列表
14if((fileinfo.attrib &  _A_SUBDIR))
15            {
16if(strcmp(fileinfo.name,".") != 0  &&  strcmp(fileinfo.name,"..") != 0)
17                    getFiles( p.assign(path).append("\\").append(fileinfo.name), files );
18            }
如何修身养性>路考靠边停车
19else
20            {
21                files.push_back(p.assign(path).append("\\").append(fileinfo.name) );
22            }
23        }while(_findnext(hFile, &fileinfo)  == 0);
24        _findclose(hFile);
25    }
26 }
_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 ,⼤概的定义如下:
1struct _finddata_t
2 {
3              unsigned attrib;
4              time_t time_create;
5              time_t time_access;
6              time_t time_write;
7              _fsize_t size;
8char name[_MAX_FNAME];
9 };
前⾯也说了,这个结构体是⽤来存储⽂件信息的,那么如何把⼀个硬盘⽂件的⽂件信息“存到”这个结构体所表⽰的内存空间⾥去呢?这就要靠_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可执⾏⽂件的程序。
1 #include <stdio.h>
2        #include <io.h>
3
4
5const char *to_search="C:\\WINDOWS\\*.exe";        //欲查的⽂件,⽀持通配符
6
7
8int main()
9        {
10long handle;                                                //⽤于查的句柄
11struct _finddata_t fileinfo;                          //⽂件信息的结构体
12              handle=_findfirst(to_search,&fileinfo);        //第⼀次查
13if(-1==handle)return -1;
14              printf("%s\n",fileinfo.name);                        //打印出到的⽂件的⽂件名
15while(!_findnext(handle,&fileinfo))              //循环查其他符合的⽂件,知道不到其他的为⽌
16              {
17                  printf("%s\n",fileinfo.name);
18            }
19              _findclose(handle);                                      //别忘了关闭句柄
20              system("pause");
21return0;
22        }
当然,这个⽂件的查是在指定的路径中进⾏,如何遍历硬盘,在整个硬盘中查⽂件呢?⼤家可以在⽹络上搜索⽂件递归遍历等⽅法,这⾥不再做进⼀步介绍。
细⼼的朋友可能会注意到我在程序的末尾⽤了⼀个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类型,引⽤传递)。在主函数中调⽤格式(并将结果保存在⽂件""中,第⼀⾏为总数):
char * filePath = "E:\\YunShi";
vector<string> files;
char * distAll = "";
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);
}
}