opendir , readdir , telldir , seekdir , rewinddir , closedir , opendir64, readdir64, telldir64, seekdir64, rewinddir64, closedir64或 fdopendir 子例程
用途
对目录执行操作。
库
标准 C 库 (libc.a)
语法
#include <dirent.h> const char *DirectoryName;
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; const char *DirectoryName;
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;描述
opendir子程序会打开DirectoryName参数指定的目录,并关联一个目录流。
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子程序从现有进程创建一个新进程,则父进程或子进程(但不能同时创建)可以使用readdir、rewinddir 或seekdir子程序继续处理目录流。
readdir64子程序与 "readdir子程序类似,只是它返回一个指向 "struct dirent64类型对象的指针。
telldir64子程序与 "telldir子程序类似,但它以 "offset_t格式返回当前目录位置。
seekdir64子程序与 "seekdir子程序相似,不同之处在于位置参数设置为 "offset_t格式。
rewinddir64子程序将指定目录流(由 "opendir64子程序获取)的位置重置为目录的起始位置。
参数
| 项 | 描述 |
|---|---|
| DirectoryName | 命名目录。 |
| DirectoryPointer | 指向开放目录的DIR或 "DIR64结构。 |
| 位置 | 指定相对于目录开头的项的偏移量。 |
返回值
成功完成后,opendir 和fdopendir子程序将返回指向DIR 类型对象的指针,而 "opendir64子程序将返回指向 "DIR64类型对象的指针。 否则,将返回空值,并设置errno全局变量来指示错误。
成功完成后,readdir子程序会返回一个指向struct dirent 类型对象的指针,而 "readdir64子程序会返回一个指向 "struct dirent64类型对象的指针。 否则,将返回空值,并设置 errno全局变量来指示错误。 当遇到目录末尾时,将返回一个空值,并且 errno全局变量不会因该函数调用而改变。
成功完成后,"telldir或 "telldir64子程序将返回与指定目录流相关的当前位置。 否则,将返回空值。
成功完成后,closedir或closedir64子程序返回值为 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