opendir函数和readdir函数内涵及用法

来源:互联网 发布:linux下docker安装部署 编辑:程序博客网 时间:2024/05/24 03:48

opendir函数

头文件:#include <sys/types.h>  #include <dirent.h>

函数:DIR *opendir(const char *name);

含义: opendir()用来打开参数name 指定的目录, 并返回DIR*形态的目录流, 和open()类似, 接下来对目录的读取和搜索都要使用此返回值.

关于DIR : 详细:http://blog.csdn.net/u012349696/article/details/50083787

先说说DIR这一结构体,以下为DIR结构体的定义:

  1. struct __dirstream   
  2.    {   
  3.     void *__fd;    
  4.     char *__data;    
  5.     int __entry_data;    
  6.     char *__ptr;    
  7.     int __entry_ptr;    
  8.     size_t __allocation;    
  9.     size_t __size;    
  10.     __libc_lock_define (, __lock)    
  11.    };   
  12.   
  13. typedef struct __dirstream DIR;  

 

DIR结构体类似于FILE,是一个内部结构,以下几个函数用这个内部结构保存当前正在被读取的目录的有关信息(摘自《UNIX环境高级编程(第二版)》)。函数 DIR *opendir(const char *pathname),即打开文件目录,返回的就是指向DIR结构体的指针,而该指针由以下几个函数使用:

  1. struct dirent *readdir(DIR *dp);   
  2.   
  3. void rewinddir(DIR *dp);   
  4.   
  5. int closedir(DIR *dp);   
  6.   
  7. long telldir(DIR *dp);   
  8.   
  9. void seekdir(DIR *dp,long loc);  

 

关于DIR结构,我们知道这么多就可以了,没必要去再去研究他的结构成员。


.....

readdir函数

头文件:#include<sys/types.h> #include <dirent.h>

函数:struct dirent *readdir(DIR *dir);

含义:readdir()返回参数dir 目录流的下个目录进入点。

struct dirent
{
    ino_t d_ino; //d_ino 此目录进入点的inode
    ff_t d_off; //d_off 目录文件开头至此目录进入点的位移
    signed short int d_reclen; //d_reclen _name 的长度, 不包含NULL 字符
    unsigned char d_type; //d_type d_name 所指的文件类型 d_name 文件名
    har d_name[256];
};

closedir函数 

头文件:#include<sys/types.h> #include <dirent.h>

函数;closedir(DIR *dir);

含义:关闭dir流 ;



ls命令编写 练习

#include <stdio.h>#include <string.h>#include <dirent.h>#include <sys/types.h>#include <sys/stat.h>#include <stdlib.h>#include <fcntl.h>#include <unistd.h>void do_ls(char *);int main(int ac,char *av[]){  if(ac == 1)do_ls(".");//打开当前目录else{while(ac--){printf("%s:\n",*++av);do_ls(*av);}}}void do_ls(char dirname[]){DIR *dir_ptr;struct dirent *direntp;dir_ptr = opendir(dirname);
if(dir_ptr == NULL){fprintf(stderr,"Ls: can not open %s",dirname);}else {   direntp = readdir(dir_ptr);while(direntp == NULL){printf("%s\n",direntp->d_name);}closedir(dir_ptr);}}


0 0
原创粉丝点击