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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C++获取⽂件夹下所有⽂件名
查找⽂件需要⼀个结构体和⼏个函数。

结构体为struct _finddata_t,函数为_findfirst、findnext和_findclose。

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];
};
其中各成员变量的含义如下:
unsigned attrib:
⽂件属性的存储位置。

它存储⼀个unsigned单元,⽤于表⽰⽂件的属性。

⽂件属性是⽤位表⽰的,主要有以下⼀些:
_A_ARCH(存档)
_A_HIDDEN(隐藏)
_A_NORMAL(正常)
_A_RDONLY(只读)
_A_SUBDIR(⽂件夹)
_A_SYSTEM(系统)
这些都是在头⽂件中定义的宏,可以直接使⽤,⽽本⾝的意义其实是⼀个⽆符号整型(只不过这个整型应该是2的⼏次幂,从⽽保证只有1位为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是⼀个常量宏,它在头⽂件中被定义,表⽰的是⽂件名的最⼤长度。

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

下⾯⼀⼀介绍。

long findfirst(char* filespec,struct _finddata_t* fileinfo);
返回值:如果查找成功的话,将返回⼀个long型的唯⼀的查找⽤的句柄(就是⼀个唯⼀编号)。

这个句柄将在_findnext函数中被使⽤。

若失败,则返回-1。

参数:
filespec:标明⽂件的字符串,可⽀持通配符。

⽐如:*.c,则表⽰当前⽂件夹下的所有后缀为C的⽂件。

⽐如:D:\\test\\*,则表⽰D盘的test⽂件夹内的所有⽂件。

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函数结束查找。

下⾯我们就按照这个思路来编写⼀个查找⼯程⽬录下的sam⽂件夹内的所有⽂件,并输出⽂件名。

1/*
2@author:CodingMengmeng
3@theme:获取指定⽂件夹下的所有⽂件名
4@time:2017-1-13 11:46:22
5@blog:/codingmengmeng/
6*/
7 #include <io.h>
8 #include <iostream>
9 #include <vector>
10using namespace std;
11
12void getFiles(string path, vector<string>& files)
13 {
14//⽂件句柄
15long hFile = 0;
16//⽂件信息,声明⼀个存储⽂件信息的结构体
17struct _finddata_t fileinfo;
18string p;//字符串,存放路径
19if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)//若查找成功,则进⼊
20 {
21do
22 {
23//如果是⽬录,迭代之(即⽂件夹内还有⽂件夹)
24if ((fileinfo.attrib & _A_SUBDIR))
25 {
26//⽂件名不等于"."&&⽂件名不等于".."
27//.表⽰当前⽬录
28//..表⽰当前⽬录的⽗⽬录
29//判断时,两者都要忽略,不然就⽆限递归跳不出去了!
30if (strcmp(, ".") != 0 && strcmp(, "..") != 0)
31 getFiles(p.assign(path).append("\\").append(), files);
32 }
33//如果不是,加⼊列表
34else
35 {
36 files.push_back(p.assign(path).append("\\").append());
37 }
38 } while (_findnext(hFile, &fileinfo) == 0);
39//_findclose函数结束查找
40 _findclose(hFile);
41 }
42 }
43
44
45int main(){
46char * filePath = "sam";//⾃⼰设置⽬录
47 vector<string> files;
48
49////获取该路径下的所有⽂件
50 getFiles(filePath, files);
51
52char str[30];
53int size = files.size();
54for (int i = 0; i < size; i++)
55 {
56 cout << files[i].c_str() << endl;
57 }
58 }
运⾏结果:
以上。

相关文档
最新文档