一.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中**/
读取文件目录
原文:http://www.cnblogs.com/qxzxxx/p/6131057.html