10月25日笔记系统IO_3目录的读取

0.问题的引入
    在linux下面 目录也是可以用open去打开,
    但是试图read一个目录的时候 会报错
        Is a directory
    既然read不能读目录,那要怎么去读里面内容?
 


 1.目录与普通文件的区别
    在Linux下面,任何一个文件要存在都必须有一个inode
    普通文件会有一个inode
    目录文件会有一个inode
    设备文件会有一个inode
    ........
    普通文件的内容  "文件内容"
    但是目录文件的内容 有什么?
        目录下面会有文件
        目录下面还会有目录
            目录的文件内容是 目录项文件数组

        创建一个空目录的时候,系统会为它预留一个目录项数组
        当你在这个文件下面创建文件或者目录的时候 就会填充一个
        目录项到目录项数组
            目录项到底是什么?
                struct dirent


2.目录操作
    普通的open打开目录文件是无法读取
        如果想要去读取目录下有什么文件(层级关系) ,就必须读取 目录项数组
        问题是怎么打开可以读?怎么读?
    (1)打开一个目录
        opendir
            在linux中,用结构体DIR来描述一个已经打开的目录
            这个结构体里面有什么?不需要你关心,有函数去处理
            把这玩意当作一个黑盒
            
            DIR* 表示一个成功打开的目录     

  NAME
            opendir, fdopendir - open a directory

        SYNOPSIS
            #include <sys/types.h>
            #include <dirent.h>

            DIR *opendir(const char *name);

          const char *name:你要打开那个目录的名字

            DIR *fdopendir(int fd);

             int fd: 你要打开那个目录的文件描述符
                
            返回值 成功返回一个DIR指针 这个指针指向一个成功打开的目录
                        失败返回NULL 同时errno被设置       

        读取一个目录项    

        NAME
                readdir - read a directory

            SYNOPSIS
                #include <dirent.h>

                struct dirent *readdir(DIR *dirp);

                DIR* dirp:表示要从那个目录下去读取目录项
                
                readdir用来从dirp指向的目录中读取下一个目录项,并返回指针
                一个目录下有多个目录,那咋办?多次调用readdir 每调用一个词
                就会返回下一个目录项的指针,直到返回NULL 表示这个目录的所有
                目录项都读完了

                struct dirent
                 {
                    ino_t          d_ino;       inode编号
                    off_t          d_off;        目录项的偏移
                    unsigned short d_reclen;    该结构体的长度
                    unsigned char  d_type;       该结构指向的那个文件类型
                    char           d_name[256];   该目录项指向的文件名
                };

                    该结构的成员中,只有d_ino和d_name是在所有的Linux中支持的
                    所以,为了让你的代码可移植性,该结构体代码中,
                    只使用d_ino和d_name这两个成员变量!!!
                
                每个目录都有两个目录(这两个目录是隐藏 需要使用 ls -a才能显出出来)
                .   当前目录
                ..  上一级目录
        
        练习
            1.打印指定目录下的所有文件和目录名称
            2.在上一个练习的基础上 打印该文件是一个文件还是目录

 


  3.关闭目录
        closedir - close a directory

        SYNOPSIS
            #include <sys/types.h>

            #include <dirent.h>
            关闭目录
            int closedir(DIR *dirp);

           DIR *dirp:你打开目录的指针

            成功返回 0
            失败返回-1 同时errno被设置


 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值