DIR opendir (const char * path );* (获取path子目录下的所由文件和目录的列表,如果path是个文件则返回值为NULL)
功能:打开一个目录,在失败的时候返回一个空的指针。
struct dirent readdir(DIR dir_handle);** (个人理解循环读取dir_handle,目录和文件都读)
功能:读取opendir 返回值的那个列表,可以循环读取,直到文件或目录都被读完返回空。
返回值:返回dirent结构体指针,dirent结构体成员如下,(文件和目录都行)
struct dirent
{
long d_ino; /* inode number 索引节点号 /
off_t d_off; / offset to this dirent 在目录文件中的偏移 /
unsigned short d_reclen; / length of this d_name 文件名长 /
unsigned char d_type; / the type of d_name 文件类型 /
char d_name [NAME_MAX+1]; / file name (null-terminated) 文件名,最长255字符 */
}
思路:
1、打开一个目录文件,目录路径为path
2、如果打开成功,则循环读取目录中的文件或目录信息
3、判断文件类型
3、如果是普通文件则输出文件地址
4、如果是目录则递归继续遍历其子目录
int search_dir(char *path)//查找path目录及其子目录下后缀为.gmdata的文件
{
DIR *dir=NULL;
struct dirent *entry=NULL;
if((dir=opendir(path))==NULL)//打开目录,返回该目录下的由目录和文件组成的列表
{
printf("opendir failed\n");
return -1;
}
else
{
while((entry=readdir(dir))!=NULL)//循环读取列表中目录(子目录)或文件的信息
{
if(strcmp(entry->d_name,".")==0||strcmp(entry->d_name,"..")==0)//滤过本地目录及上级目录的信息,防止死循环
continue;
if(4==entry->d_type)//子目录,递归继续遍历子目录
{
char pathbuf[1024]={0};
sprintf(pathbuf,"%s/%s",path,entry->d_name);
search_dir(pathbuf);
}
else//文件
{
char *tmp=strrchr(entry->d_name,'.');
if(tmp==NULL)
continue;
if(strcmp(tmp,".gmdata")==0)
{
char buf[1024]={0};
sprintf(buf,"%s/%s",path,entry->d_name);
printf("%s\n",buf);
}
}
}
}
return 0;
}