电脑技术学习

UNIX 文件系统基本操作

dn001

  dirent.h 函数,opendir()、readdir() 和 closedir(),它们正是您所需要的。这些函数的使用与用来对文件进行操作的 open/read/close 的习惯用法非常相似,但有一点除外:对于每个目录条目,readdir() 函数一次返回一个指向特殊结构(struct dirent 类型)的指针。通常,对目录进行浏览类似于清单 1 中所示的伪代码。

  清单 1. 读取目录中的内容

dir = opendir( "some/path/name" )
entry = readdir( dir )
while entry is not NULL:
  do_something_with( entry )
  entry = readdir( dir )
closedir( dir )

  在出现问题时,opendir() 和 readdir() 函数都会返回 NULL,并且将设置全局变量 errno 的值,以指出所出现的错误。如果 readdir() 返回 NULL,并且 errno 为 0(有时也称为 EOK 或 ENOERROR),则表示没有其他的目录条目。

  有一点需要注意,每个目录都包含“.(对该目录的引用)和“..(对该目录的父目录的引用)条目。根据您所进行的操作,可能需要忽略对这些条目的处理。

  请注意,readdir() 不是线程安全的,因为所返回的结构是存储在函数库中的一个静态变量。大多数现代的 Unix 系统都具有线程安全的 readdir_r(),如果您正在编写线程代码,可以使用这个函数作为替代。

  struct dirent 中包含了哪些内容呢?

  POSIX 1003.1 标准仅仅为 struct dirent 定义了一个必需的条目,即 char 数组 d_name。这是用标准的以 NULL 结尾的字符串表示的该条目的名称。这个结构中任何其他内容都是特定于您的 UNIX 系统的。

  的确如此,struct dirent 中其他所有内容 都是不可移植的。严格满足一致性的系统不应该在其中包含任何其他的内容。如果您编写了使用额外结构成员的代码,那么您必须将其标记为不可移植的,并且包含一个完成相同任务的替换代码路径,如果您认为这样做特别友好的话。

标签: