新建一个目录类,里面有一个获取指定目录下的所有指定后缀名文件的函数,然后赋值到一个二维数组里,并通过引用来把有多少个文件赋值到len里。
先创建一个dir.cpp,一个dir.h,一个main.cpp
在dir,h里放类的定义
#ifndef DIR_H
#define DIR_H
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <string.h>
class Dir
{
public:
//构造函数
Dir();
//查询目录函数
static void entryList(const char *dirPath, const char *filter,char(*fileName)[256],int &len);
};
#endif // DIR_H
在dir.cpp里放类的功能函数
#include "dir.h"
//构造函数
Dir::Dir()
{
}
/*
查找目录下的指定文件后罪名的文件并返回二维数组
dirPath 查找的目录
filter 查找文件的后罪名
fileName 保存数据的二维数组
len 有多少个文件
*/
void Dir::entryList(const char *dirPath, const char *filter, char(*fileName)[256], int &len)
{
//打开dirpath目录
DIR * fp = opendir( dirPath );
//判断是否打开成功
if(fp == NULL)
{
perror("opendir error");
return ;
}
//循环读取目录
while(1)
{
//读取目录下的文件
struct dirent * info = readdir(fp);
//判断是否读取成功
if(info == NULL)
{
break;
}
//判断文件是否是一个普通文件,排除以点开头(隐藏文件)的文件名,判断文件名是否含有filter字符串
if(info->d_type == DT_REG && info->d_name[0] != '.' &&
strstr(info->d_name,filter)!=NULL)
{
//保存文件名
char text[1024] = {0};
//检查dirPath的最后一个字符是否是斜杠(/),来决定保存名字的时候要不要加/
if(dirPath[strlen(dirPath)-1] == '/')
{
sprintf(text,"%s%s",dirPath,info->d_name);
}
else{
sprintf(text,"%s/%s",dirPath,info->d_name);
}
//存储到数组中
strcpy(fileName[len++],text);
}
}
}
再从main.cpp中调用
#include <iostream>
#include "dir.h"
using namespace std;
int main()
{
//保存文件名的二维数组
char fileName[100][256] = {0};
//文件数量
int len = 0;
//通过类来调用entryList来查询./目录下的.cpp文件,并保存到fileName二维数组里
Dir::entryList("./",".cpp",fileName,len);
//打印fileName二维数组
for(int i=0; i<len; i++)
{
cout<<fileName[i]<<endl;
}
return 0;
}
为什么这么写:
这样子就不用每次查找目录下的文件时新建一个对象了,直接通过类来调用entryList来获取就好,方便很多