一.opendir与readdir函数
1.opendir是一个库函数,打开一个目录,并返回一个DIR指针给readdir函数
DIR *opendir(const char *name);
2.readdir是一个库函数,接收参数是DIR指针,返回一个struct dirent *结构体指针
struct dirent *readdir(DIR *dirp);
二.dirent结构体
struct dirent {
ino_t d_ino; /* inode number 文件的inode*/
off_t d_off; /* not an offset; see NOTES 文件所在的位置*/
unsigned short d_reclen; /* length of this record 文件名的长度*/
unsigned char d_type; /* type of file; not supported
by all filesystem types 文件类型*/
char d_name[256]; /* filename 文件名*/
};
三.可重入函数和不可重入函数
1.在readdir函数使用时,可以看出返回值struct dirent *这个结构体指针,这个结构体在使用函数之前并没有为它申请内存,可见是在readdir函数内部为其申请的内存,而readdir函数多次被调用执行时只有在第一次执行时才会为struct dirent结构体开辟空间,后面执行时都用的是第一次创建的struct dirent结构体,也就是说每次readdir函数执行时都是相互之间有关联的,因此readdir函数是不可重入的函数
2.所谓可重入函数是指一个可以被多个任务调用的过程,任务在调用时不必担心数据是否会出错。
3.不可重入函数在实时系统设计中被视为不安全函数。满足下列条件的函数多数是不可重入的:
1) 函数体内使用了静态的数据结构;
2) 函数体内调用了malloc()或者free()函数;
3) 函数体内调用了标准I/O函数。
4.readdir函数还有一个类似的readdir_r函数,这个函数就是可重入的函数,需要在函数外面创建struct dirent结构体并分配内存。
int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);
四.示例代码
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
int main(int argc, char *argv[])
{
DIR *dir = NULL;
struct dirent *ent = NULL;
if(argc != 2)
{
printf("usage:%s filename\n",argv[0]);
return -1;
}
//打开目录
dir = opendir(argv[1]);
if(NULL == dir)
{
perror("opendir");
return -1;
}
//读取目录
while(1)
{
ent = readdir(dir);
if(ent != NULL)
{
//读取到了子文件,处理子文件
printf("filename: [%s]\n",ent->d_name);
}
else
break;
}
return 0;
}
/*
* 要读取某个目录下某个文件的详细信息
*一般步骤是:
* 1.使用opendir函数打开目录A,返回指向目录A的DIR结构体指针D。
* 2.调用readdir(D)函数读取目录A下所有的文件(包含目录),返回指向A目录下所有文件的struct dirent结构体指针E。
* 3.遍历E,调用stat(E->d_name,stat *P)来获取每个文件的详细信息,存储在stat结构体P中
*
*/