opendir , readdir , telldir , seekdir , rewinddir , closedir , opendir64, readdir64, telldir64, seekdir64, rewinddir64, closedir64或 fdopendir 子例程

用途

对目录执行操作。

标准 C 库 (libc.a)

语法

#include <dirent.h>
DIR *opendir ( DirectoryName)
const char *DirectoryName;
struct dirent *readdir ( DirectoryPointer)
DIR *DirectoryPointer;
long int telldir(DirectoryPointer)
DIR *DirectoryPointer;
void seekdir(DirectoryPointer,Location)
DIR *DirectoryPointer;
long Location;
void rewinddir (DirectoryPointer)
DIR *DirectoryPointer;
int closedir (DirectoryPointer)
DIR *DirectoryPointer;
DIR *opendir64 ( DirectoryName)
const char *DirectoryName;
struct dirent64 *readdir64 ( DirectoryPointer)
DIR64 *DirectoryPointer;
offset_t telldir64(DirectoryPointer)
DIR64 *DirectoryPointer;
void seekdir64(DirectoryPointer,Location)
DIR64 *DirectoryPointer;
offset_t Location;
void rewinddir64 (DirectoryPointer)
DIR64 *DirectoryPointer;
int closedir64 (DirectoryPointer)
DIR64 *DirectoryPointer;
DIR *fdopendir(fd);
int fd;

描述

请注意请勿在多线程环境中使用readdir子程序。 请参阅readdir_r子程序文章中的多线程替代方案。

opendir子程序会打开DirectoryName参数指定的目录,并关联一个目录流。

注意:必须始终使用closedir子程序关闭已打开的目录,以确保下次尝试打开该目录时能够成功。

opendir子程序还会返回一个指针,以便在后续操作中识别目录流。 如果无法访问DirectoryName参数指定的目录,或内存不足以容纳整个数据流,就会返回空指针。 成功调用任何执行函数后,都会关闭调用进程中打开的任何目录流。

fdopendir()函数等同于opendir()函数,不同之处在于目录是由文件描述符而不是名称指定的。 在调用时与文件描述符关联的文件偏移量确定返回的条目。

fdopendir() 成功返回后,文件描述符将处于系统控制之下,如果试图关闭文件描述符或修改相关描述的状态,而不是通过closedir()readdir()readdir_r()rewinddir(),则行为将是未定义的。 调用closedir()时,文件描述符将被关闭。

readdir子程序返回指向下一个目录项的指针。 readdir子程序会返回 .NET Framework 的条目。 (点)和 .. (点),但绝不会返回无效条目(用d_ino设置为 0)。 当到达目录末尾或检测到 "目录操作无效时,"读取目录子程序会返回空值。 返回的指针指定的数据可能会被在同一目录流上再次调用readdir子程序所覆盖。 在不同目录流中调用readdir子程序不会覆盖这些数据。 readdir子程序标记了st_atime字段,以便每次实际读取目录时更新。

telldir子程序返回与指定目录流相关的当前位置。

seekdir子程序会设置下一个 readdir子程序操作在目录流中的位置。 如果试图寻找一个无效位置,下次调用readdir子程序时将返回空值。 位置应该是之前调用 telldir子程序返回的位置。

rewinddir子程序将指定目录流的位置重置为目录的起始位置。

closedir子程序关闭一个目录流,并释放与DirectoryPointer参数相关的结构。 如果调用 "closedir子程序的目录已经关闭,则行为未定义。 为避免出现这种情况,请在关闭后始终将DirectoryPointer参数初始化为空。

如果使用fork子程序从现有进程创建一个新进程,则父进程或子进程(但不能同时创建)可以使用readdirrewinddirseekdir子程序继续处理目录流。

opendir64子程序与 "opendir子程序类似,只是它返回一个指向 "DIR64类型对象的指针。
注意:"opendir64子程序打开的目录必须始终用 "closedir64子程序关闭,以确保下次尝试打开该目录时成功。 此外,还必须使用 64 位接口(readdir64、"telldir64、"seekdir64、"rewinddir64"和 "closedir64)进行操作,以获取正确的目录信息。

readdir64子程序与 "readdir子程序类似,只是它返回一个指向 "struct dirent64类型对象的指针。

telldir64子程序与 "telldir子程序类似,但它以 "offset_t格式返回当前目录位置。

seekdir64子程序与 "seekdir子程序相似,不同之处在于位置参数设置为 "offset_t格式。

rewinddir64子程序将指定目录流(由 "opendir64子程序获取)的位置重置为目录的起始位置。

参数

描述
DirectoryName 命名目录。
DirectoryPointer 指向开放目录的DIR或 "DIR64结构。
位置 指定相对于目录开头的项的偏移量。

返回值

成功完成后,opendirfdopendir子程序将返回指向DIR 类型对象的指针,而 "opendir64子程序将返回指向 "DIR64类型对象的指针。 否则,将返回空值,并设置errno全局变量来指示错误。

成功完成后,readdir子程序会返回一个指向struct dirent 类型对象的指针,而 "readdir64子程序会返回一个指向 "struct dirent64类型对象的指针。 否则,将返回空值,并设置 errno全局变量来指示错误。 当遇到目录末尾时,将返回一个空值,并且 errno全局变量不会因该函数调用而改变。

成功完成后,"telldir或 "telldir64子程序将返回与指定目录流相关的当前位置。 否则,将返回空值。

成功完成后,closedirclosedir64子程序返回值为 0。 否则,返回值为-1,并设置 errno全局变量来指示错误。

错误代码

如果opendir子程序不成功,则会返回一个空值,并将errno全局变量设置为以下值之一:

描述
EACCES 指示拒绝对 DirectoryName 参数的任何组件的搜索许可权,或拒绝对 DirectoryName 参数的读许可权。
ENAMETOOLONG 指示 DirectoryName 参数自变量的长度超过 PATH_MAX 值,或者当 POSIX_NO_TRUNC 值生效时,路径名组件的长度超过 NAME_MAX 值。
ENOENT 表示指定的目录不存在。
ENOTDIR 指示 DirectoryName 参数的组件不是目录。
电子文件 指示当前为该进程打开的文件描述符过多。
ENFILE 指示当前在系统中打开了太多文件描述符。

如果readdir或 "readdir64子程序不成功,则返回空值,并将errno全局变量设置为以下值:

描述
EBADF 指示 DirectoryPointer 参数自变量未引用开放式目录流。

如果closedir或 "closedir64子程序不成功,则返回值为-1,并将errno全局变量设置为以下值:

描述
EBADF 指示 DirectoryPointer 参数自变量未引用开放式目录流。

如果fdopendir子例程不成功,它将返回一个空值,并将errno全局变量设置为以下值之一:

描述
EBADF 表示fd参数不是有效的文件描述符,无法打开读取。
ENOTDIR 表示描述符fd与目录无关。

示例

要在目录中搜索条目name:

len = strlen(name);
DirectoryPointer = opendir(".");
for (dp = readdir(DirectoryPointer); dp != NULL; dp =
 readdir(DirectoryPointer))
        if (dp->d_namlen == len && !strcmp(dp->d_name, name)) {
                closedir(DirectoryPointer);
                DirectoryPointer=NULL     //To prevent multiple closure
                return FOUND;
        }
closedir(DirectoryPointer);
                DirectoryPointer=NULL     //To prevent multiple closure