C++获取文件夹下的所有文件名
之前导师给了自己一个任务,需要获取一个目录下的所有文件名,所有就查找了相关的操作,并进行总结。
对于获取某个目录下的所有文件名,在Linux系统和Window系统中的操作是不同的,下面分别从两个系统进行介绍。
1、Windows下获取所有文件名操作
-
Window下获取所有文件名的操作主要用到了结构体struct_finddata_t,以及函数_findfirst、_findnext和_fineclse,位于头文件<>中。
-
_finddata_t结构体
struct _finddata_t
{
unsigned attrib;//文件属性的存储位置。它存储一个unsigned单元,用于表示文件的属性。文件属性是用位表示的,主要有以下一些:_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[_MAX_FNAME];//文件的文件名
};
-
函数_findfirst()
- 函数原型:long _findfirst( char *filespec, struct _finddata_t *fileinfo);
- 返回值:如果查找成功的话,将返回一个long型的唯一的查找用的句柄(就是一个唯一编号)。这个句柄将在_findnext函数中被使用。若失败,则返回-1。
- 参数:filespec标明文件的完整路径,可支持通配符,比如:*.c,则表示当前文件夹下的所有后缀为C的文件。fileinfo :这里就是用来存放文件信息的结构体的指针。这个结构体必须在调用此函数前声明,不过不用初始化,只要分配了内存空间就可以了。函数成功后,函数会把找到的文件的信息放入这个结构体中。
-
函数_findnext()
-
函数原型: int _findnext( long handle, struct _finddata_t *fileinfo );
-
返回值:若成功返回0,否则返回-1。
-
参数:handle:即由_findfirst函数返回回来的句柄。fileinfo:文件信息结构体的指针。找到文件后,函数将该文件信息放入此结构体中。
-
-
函数_findclose()
- 函数原型: int _findclose( long handle );
- 返回值:成功返回0,失败返回-1。
- 参数:handle :_findfirst函数返回回来的句柄。
-
整个过程:先用_findfirst查找第一个文件,若成功则用返回的句柄调用_findnext函数查找其他的文件,当查找完毕后用,用_findclose函数结束查找。
-
代码:
#include <>
#include <>
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",); //打印出找到的文件的文件名
while(!_findnext(handle,&fileinfo)) //循环查找其他符合的文件,知道找不到其他的为止
{
printf("%s\n",);
}
_findclose(handle); //别忘了关闭句柄
system("pause");
return 0;
}
- 对目录中的所有文件以及子目录进行搜索(采用递归)
vector<string> files;
获取该路径下的所有文件
getFiles(filePath, files );
char str[30];
int 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((path).append("\\*").c_str(),&fileinfo)) != -1)
{
do
{
//如果是目录,迭代之
//如果不是,加入列表
if(( & _A_SUBDIR))
{
if(strcmp(,".") != 0 && strcmp(,"..") != 0)
getFiles( (path).append("\\").append(), files );
}
else
{
files.push_back((path).append("\\").append() );
}
}while(_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}
2、Linux下获取所有文件操作
- Linux下遍历目录中的所有文件的相关函数包括opendir()->readdir()->closedir(),位于头文件中。
- 函数opendir()
- 函数原型:DIR *opendir(const char *path);
- 函数返回DIR*,表示打开的目录句柄。
- 若函数返回NULL,表示打开目录失败。
- 函数readdir()
- 函数原型:struct dirent *readdir(DIR *dirp);
- 函数返回结构体dirent指针。
- 若返回值为NULL,则获取目录内容失败或目录内容已经全部读取完成。
- dirent结构体
struct dirent {
ino_t d_ino; //表示存放的该文件的结点数目
off_t d_off; //表示文件在目录中的偏移
unsigned short d_reclen; /* length of this record */
unsigned char d_type; //表示文件类型
char d_name[256]; //表示文件名字
};
unsigned char d_type,文件或目录的类型。它有可能的取值如下:
DT_UNKNOWN,未知的类型
DT_REG,普通文件
DT_DIR,普通目录
DT_FIFO,命名管道或FIFO
DT_SOCK,本地套接口
DT_CHR,字符设备文件
DT_BLK,块设备文件
-
函数closedir()
- 函数原型:int closedir(DIR *dirp);
- 返回值:0正常 -1错误
-
操作步骤:
- 1、打开指定目录opendir得到目录句柄;
- 2、然后通过while循环不断readdir获取目录的内容,并存储到struct dirent 结构体变量中;
- 3、获取该结构体变量的成员函数d_name就得到了待扫描的文件,然后在使用sprintf函数加入文件绝对路径,就可以调用API进行扫描了;
- 4、最后关闭目录句柄closedir
-
代码:
#include <>
#include <>
#include <sys/>
int main(int argc,char **argv){
DIR *dirp = NULL;
struct dirent *dir_entry = NULL;
char namebuf[100] = {0};
if((dirp = opendir(argv[1])) == NULL){
printf("Opendir %s fail!\n",argv[1]);
return -1;
}
while((dir_entry = readdir(dirp)) != NULL){
sprintf(namebuf,"xxx/xxx/xx/%s",dir_entry->d_name); //这里可以根据实际情况处理,若是需要遍历整个目录,只需要从xxx;
........
}
closedir(dirp);
}
参考链接:
/angle_birds/article/details/8503039
/donghanhang/article/details/51106778
/leo_888/article/details/80681184