文件IO操作(09)——opendir、readdir、closedir函数

opendir、readdir、closedir函数

opendir函数

#include <sys/types.h>

#include <dirent.h>

DIR *opendir(const char *name);

DIR *fdopendir(int fd);

opendir() 函数打开一个目录流(stream) ,参数是目录的路径, 返回指向这个目录的流指针。这个流指针指向打开目录的第一个记录项。

fdopendir()和 opendir()类似, 但是返回值是一个已经打开的目录的目录流指针。

返回值 :opendir() 和fdopendir()函数返回一个目录流指针,出错的时候返回 NULL 并且会设置errno错误位。

ERRORS

EACCES Permission denied.权限不够

EBADF fd 不是一个有效的文件描述符,无法打开进行阅读。

EMFILE 文件描述符指向的文件被多个进程打开。

ENFILE 在该系统中打开了过多的文件。

ENOENT 目录不存在或目录名为空

ENOMEM 内存不足进行次操作

ENOTDIR name is not a directory.参数不是一个目录

readdir函数

#include <dirent.h>

struct dirent *readdir(DIR *dirp);

int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);

readdir() 函数返回目录流指针指向的目录中的记录的下一项 。(第一次调用返回第一个记录项,第二次调用返回第二个记录项...)

在Linux中, dirent structure的定义大致如下:

//记录项的内容

struct dirent {

ino_t d_ino; /* inode number */

off_t d_off; /* 到下一个dirent的偏移 */

unsigned short d_reclen; /* 本记录项的长度 */

unsigned char d_type; /* 文件的类型,不支持所有文件系统*/

char d_name[256]; /* filename */

};

closedir函数

#include <sys/types.h>

#include <dirent.h>

int closedir(DIR *dirp);

closedir() 函数关闭一个目录流指针关联的目录。一次成功的调用closedir() 将闭底层的文件描述符与各种相关联。在此调用后,目录流描述符各种不可用。

closedir() 成功返回0,不成功返回 -1 并设置 errno。

ERRORS错误标识

EBADF 目录流无效关联

 

仿tree命令程序代码

   1: #include <sys/types.h>
   2: #include <dirent.h>
   3: #include <sys/types.h>
   4: #include <stdio.h>
   5: #include <stdlib.h>
   6: #include <string.h>
   7: #include <errno.h>
   8:  
   9: //       struct dirent *readdir(DIR *dirp);
  10: //       DIR *opendir(const char *name);
  11: //       DIR *fdopendir(int fd);
  12:  
  13: #define PATH_MAX_SIZE 2048
  14: char DirName[PATH_MAX_SIZE]={0};
  15: void mytree(char *path,int n)
  16: {
  17:     if(path==NULL || n>9 || path[0]=='.' || path[0]=='\0'){
  18:         return ;
  19:     }
  20:     struct DIR* OpenDir=opendir(path);
  21:     if(OpenDir==NULL){
  22:         perror("open dir error ");
  23:     }
  24:  
  25:     long int errno_bak=errno;
  26:     char *space=(char*)malloc( n*4 +1);
  27:     memset(space,' ',n*4+1);
  28:     space[n*4+1]='\0';
  29:     
  30:     struct dirent* RdDir= NULL;
  31:     while((RdDir=readdir(OpenDir))!=NULL){
  32:         if(RdDir->d_type == DT_DIR){
  33:             strncpy(DirName,RdDir->d_name,255);
  34:             if(DirName[0]=='.'){
  35:             //  RdDir=readdir(OpenDir);
  36:                 continue;
  37:             }   
  38:             printf("%s|__",space);
  39:             printf("%s\n",RdDir->d_name);
  40:  
  41:             if(strlen(path)+strlen(RdDir->d_name)<PATH_MAX_SIZE-2){
  42:                 memset(DirName,0,PATH_MAX_SIZE);
  43:                 strncpy(DirName,path,strlen(path));
  44:                 DirName[strlen(path)]='/';
  45:                 strncpy(DirName+strlen(path)+1,RdDir->d_name,strlen(RdDir->d_name));
  46: //              puts(DirName);
  47:                 mytree(DirName,n+1);
  48:             }
  49:             
  50:         }else{
  51:             printf("%s|__",space);
  52:             printf("%s\n",RdDir->d_name);
  53:         }
  54:     }
  55:     free(space);
  56:     if(closedir(OpenDir)!=0){
  57:         perror("close dir error ");
  58:         exit(0);
  59:     }
  60:     if(errno != errno_bak){
  61:         perror("read dir error ");
  62:         exit(1);
  63:     }
  64: }
  65: //===========================================================
  66:  
  67: int main(int argc,char* argv[])
  68: {
  69:     if(argc < 2){
  70:         puts("Not input dir name");
  71:         exit(1);
  72:     }
  73:     mytree(argv[1],0);
  74:     return 0;
  75:  
  76: }

你可能感兴趣的:(文件IO操作(09)——opendir、readdir、closedir函数)