4.22 读目录

    对某个目录具有访问权限的任意用户都可以读该目录,但是,为了防止文件系统产生混乱,只有内核才能写目录。回忆4.5节,一个目录的写权限位和执行权限位决定了在该目录中能否创建新文件以及删除文件,它们并不表示能否写目录本身。

    目录的实际格式依赖于UNIX系统实现和文件系统的设计。早期的系统(如V7)有一个较简单的结构:每个目录项是16个字节,其中14个字节是文件名,2个字节是i节点编号。而对于4.2BSD,由于它允许更长的文件名,所以每个目录项的长度时可变的。这就意味着读目录的程序与系统相关。为了简化读目录的过程,UNIX现在包含了一套与目录有关的例程,它们是POSIX.1的一部分。很多实现阻止应用程序使用read函数读取目录的内容,由此进一步将应用程序与目录格式中与试下你相关的细节隔离。

#include <dirent.h>

DIR * opendir(const char *pathname);

DIR * fdopendir(int fd);

                                                                                                                                两个函数返回值:若成功,返回指针;若出错,返回NULL

struct dirent *readdir(DIR *dp);

                                                                                                                             返回值:若成功,返回指针;若在目录为或出错,返回NULL

void rewinddir(DIR *dp);

int closedir(DIR*dp);

                                                                                                                                    返回值:若成功,返回0;若出错,返回-1

long telldir(DIR *dp);

                                                                                                                                         返回值:与dp关联的目录中的当前位置

void  seekdir(DIR *dp, logn loc);

    fdopendir函数最早出现在SUSv4中,它提供了一种方法,可以把打开文件描述符转换成目录处理函数需要的DIR结构。

    telldir 和 seekdir 函数不是基本POSIX.1 标准的组成部分。它们是Single UNIX Specification 中XSI扩展,所以可以期望所有符合UNIX系统的试下你都会提供这两个函数。

    回忆一下,在图1-3程序中(ls命令的基本实现部分)使用了其中几个函数。

    定义在头文件<dirent.h>中的dirent结构与实现有关。实现对此结构所做的定义至少包含下列两个成员:

    ino_t  d_ino;

    char d_name[];

    注意,d_name项的大小并没有指定,但必须保证它能包含至少NAME_MX个字节(不包含终止null字节,回忆图2-15)。因为文件名是以null字节结束的,所以在头文件中如何定义数组d_name并无多大关系,数组大小并不表示文件名的长度。

    DIR结构是一个内部结构,上述7个函数用这个内部结构保存当前正在被读的目录的有关信息。其作用类似于FILE结构。FILE结构由标准I/O库维护,我们将在第5章中对它进行说明。

    由opendir和fdopendir返回的指向DIR结构的指针由另外5个函数使用。opendir执行初始化操作,使第一个readdir返回目录中的第一个目录项。DIR结构由fdopendir创建时,readdir返回的第一项取决于传给fdopendir函数的文件描述符相关联的文件偏移量。注意,目录中各目录项的顺序与实现有关。它们通常并不按字母顺序排列。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值