1)打开指定目录opendir得到目录句柄;
2)然后通过while循环不断readdir获取目录的内容,并存储到struct dirent 结构体变量中;
3)获取该结构体变量的成员函数d_name就得到了待扫描的文件,然后在使用sprintf函数加入文件绝对路径,就可以调用API进行扫描了;
4)最后关闭目录句柄closedir。
---------------------------------------------------------
opendir原型:
DIR *opendir(const char *path);
DIR *dirp; //接受打开目录句柄
返回值:NULL 打开目录失败
---------------------------------------------------------
readdir原型:
struct dirent *dir_entry; //存储获取的目录内容
struct dirent *readdir(DIR *dirp);
返回值:NULL 获取目录内容失败或者目录内容已经全部读取完成 ;
---------------------------------------------------------
closedir原型:
int closedir(DIR *dirp);
返回值:0正常 -1错误
---------------------------------------------------------
关于struct dirent结构体主要注意两个成员即可,若有特殊情况特殊处理:
Struct dirent
{
ino_t d_ino; //此目录进入点的inode
ff_t d_off; //目录文件开头到此目录进入点的位移
signed short int d_reclem; //_name的长度,不包含NULL字符
unsigned char d_type; // d_name所指的文件类型
char d_name[256]; //文件名
};
主要关注d_name(文件名)和d_type(文件类型),关于文件名就不在多说就是返回文件名字符串,而文件类型则分为两类普通文件和文件夹,%d显示的值4代表目录,8代表文件,也就是通过dir_entry->d_type直接与4或者8比较作为if判断条件
从而可以实现遍历主目录下所有文件包括子目录,关于目录的操作基本这些,更深入的根据不同情况来定,下面看一下简单
的实现代码示例:
#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>
int main(int argc,char **argv){
DIR *dirp = NULL;
struct dirent *dir_entry = NULL;
char namebuf[100] = {0};
if(argc != 2){
printf("Error! Usage:%s [dirpath]\n",__func__); //提示使用规则 可执行程序 + 目录
return -1;
}
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; //main函数中剥离打开目录并获取和关闭的功能,通过递归实现
........
}
closedir(dirp);
}
转载:http://blog.csdn.net/donghanhang/article/details/51106778