首页 > 代码库 > 读取文件目录

读取文件目录

一.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);
四.示例代码
    
  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <dirent.h>
  4. int main(int argc, char *argv[])
  5. {
  6. DIR *dir = NULL;
  7. struct dirent *ent = NULL;
  8. if(argc != 2)
  9. {
  10. printf("usage:%s filename\n",argv[0]);
  11. return -1;
  12. }
  13. //打开目录
  14. dir = opendir(argv[1]);
  15. if(NULL == dir)
  16. {
  17. perror("opendir");
  18. return -1;
  19. }
  20. //读取目录
  21. while(1)
  22. {
  23. ent = readdir(dir);
  24. if(ent != NULL)
  25. {
  26. //读取到了子文件,处理子文件
  27. printf("filename: [%s]\n",ent->d_name);
  28. }
  29. else
  30. break;
  31. }
  32. return 0;
  33. }
  34. /*
  35. * 要读取某个目录下某个文件的详细信息
  36. *一般步骤是:
  37. * 1.使用opendir函数打开目录A,返回指向目录A的DIR结构体指针D。
  38. * 2.调用readdir(D)函数读取目录A下所有的文件(包含目录),返回指向A目录下所有文件的struct dirent结构体指针E。
  39. * 3.遍历E,调用stat(E->d_name,stat *P)来获取每个文件的详细信息,存储在stat结构体P中
  40. *
  41. */




来自为知笔记(Wiz)


读取文件目录