文档章节

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

乌合之众
 乌合之众
发布于 2014/11/18 15:24
字数 764
阅读 130
收藏 0

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: }

© 著作权归作者所有

乌合之众
粉丝 14
博文 90
码字总数 79438
作品 1
海淀
程序员
私信 提问
目录操作函数

/* 如果这个目录有很多函数 a.txt b.txt j.exe japan.avi aa.bmp */ //匹配文件 print_r(glob('./*.php')); /* opendir 打开目录 readdir 读取目录 mkdir 创建目录 fmdir 删除目录 closedir......

科技小能手
2017/11/12
0
0
Linux系统编程 --- 如何列出一个目录下面的所有文件

linux平台可以使用opendir函数来打开一个目录,用readdir读取目录当中的一个entry(一个entry可以是子目录,文件,软硬链接等),如果需要读取所有目录下面的文件,需要使用while((entry = re...

米狗族
2011/01/27
266
1
来客电商

来客电商 项目介绍 非常惭愧地说,最开始是完全模仿着拼多多的功能模块来做这套系统,也仅仅是为了磨合团队,提高业务水平而已。 可谁知道,做完了拼团基本功能,还发现有评价没有做,好吧,...

沐零
2018/09/10
0
0
基于PHP7的PHP扩展开发之十三(进行流的操作)

基于PHP7的PHP扩展开发之十三(进行流的操作) Love冥天个人博客-关注IT|PHP|互联网|php个人博客交流2017-07-2940 阅读 目的:在扩展中进行流的操作。简单来讲就是对一些文件,网络的IO操作。...

Love冥天个人博客-关注IT|PHP|互联网|php个人博客交流
2017/07/29
0
0
php函数积累第二弹(关于文件操作)

----文件操作---- realpath(path) 函数根据文件的相对路径路径返回绝对路径。 dirname(path) 返回路径中的目录部分。 isdir(dirpath) 判断文件夹路径是否正确(存在) scandir(dirpath,sort...

Jceee
2014/04/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

中奖名单 | “赠书活动”中奖名单公布

在上周的赠书活动中, 小伙伴们踊跃参与! 京小云也很认真地进行了统计, 非常感谢大家的参与和支持! 下面公布中奖的名单~ 请中奖的小伙伴于5个工作日内 在微信公众号后台留下你的联系地址 ...

京东云技术新知
15分钟前
1
0
云原生生态周报 Vol. 11 | K8s 1.16 早知道

业界要闻 Pivotal 发布了完全基于 Kubernetes 的 Pivotal Application Service(PAS)预览版 这意味着 Pivotal 公司一直以来在持续运作的老牌 PaaS 项目 Cloud Foundry (CF)终于得以正式拥...

阿里巴巴云原生
15分钟前
0
0
低版本xcode真机调试iOS 12.3.1

老款mac pro已经升级不了系统了,导致最新版的xcode10.2及以上也安装不了,最新版的ios12.3.1也联机调试不了,apple是要逼着大家升级硬件啊,软件即服务,就是这样来的,大部分计算机软件公司...

swingcoder
15分钟前
4
0
浅谈堆排序

一:定义 堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆排序是一种树形选择排序,在排序过程中可以把元素看成是一颗完全二叉树,每个节点都大(小)于它的两个子...

无名氏的程序员
17分钟前
2
0
Alibaba Cloud Linux 2 开源后又有什么新动作?

阿里妹导读:2019 年 4 月,Alibaba Cloud Linux 2 (Aliyun Linux 2) 正式开源。时至今日,已经走过三个月的里程。在这段时间内,这个刚诞生不久的为阿里云 ECS 环境定制优化的 Linux 操作系...

阿里云官方博客
18分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部