opendir(打开目录)

 

相关函数

open,readdir,closedir,rewinddir,seekdir,telldir,scandir

表头文件

#include<sys/types.h>

#include<dirent.h>

定义函数

DIR * opendir(const char * name);

函数说明

opendir()用来打开参数name指定的目录,并返回DIR*形态的目录流,和open()类似,接下来对目录的读取和搜索都要使用此返回值。

返回值

成功则返回DIR* 型态的目录流,打开失败则返回NULL。

错误代码

EACCESS 权限不足

EMFILE 已达到进程可同时打开的文件数上限。

ENFILE 已达到系统可同时打开的文件数上限。

ENOTDIR 参数name非真正的目录

ENOENT 参数name 指定的目录不存在,或是参数name 为一空字符串。

ENOMEM 核心内存不足。

 

readdir(读取目录)

 

相关函数

open,opendir,closedir,rewinddir,seekdir,telldir,scandir

表头文件

#include<sys/types.h>

#include<dirent.h>

定义函数

struct dirent * readdir(DIR * dir);

函数说明

readdir()返回参数dir目录流的下个目录进入点。

结构dirent定义如下

struct dirent

{

ino_t d_ino;

ff_t d_off;

signed short int d_reclen;

unsigned char d_type;

har d_name[256;

};

d_ino 此目录进入点的inode

d_off 目录文件开头至此目录进入点的位移

d_reclen _name的长度,不包含NULL字符

d_type d_name 所指的文件类型

d_name 文件名

返回值

成功则返回下个目录进入点。有错误发生或读取到目录文件尾则返回NULL。

附加说明

EBADF参数dir为无效的目录流。

 

closedir(关闭目录)

 

相关函数

opendir

表头文件

#include<sys/types.h>

#include<dirent.h>

定义函数

int closedir(DIR *dir);

函数说明

closedir()关闭参数dir所指的目录流。

返回值

关闭成功则返回0,失败返回-1,错误原因存于errno 中。

错误代码

EBADF 参数dir为无效的目录流

范例

参考readir()。

 

下面我们开发一个小程序,这个程序有一个参数.如果这个参数是一个文件名,我们输出这

个文件的大小和最后修改的时间,如果是一个目录我们输出这个目录下所有文件的大小和

修改时间.

点击(此处)折叠或打开

1. #include <unistd.h>
2. #include <stdio.h>
3. #include <errno.h>
4. #include <sys/types.h>
5. #include <sys/stat.h>
6. #include <dirent.h>
7. #include <time.h>
8. 
9. static int get_file_size_time(const char *filename) {
10.     struct stat statbuf;
11.     if (stat(filename, &statbuf) == -1) {
12.         printf("Get stat on %s Error:%s\n",
13.                 filename, strerror(errno));
14.         return (-1);
15.     }
16.     if (S_ISDIR(statbuf.st_mode))return (1);
17.     if (S_ISREG(statbuf.st_mode))
18.         printf("%s size:%ld bytes\tmodified at %s",
19.             filename, statbuf.st_size, ctime(&statbuf.st_mtime));
20.     return (0);
21. }
22. 
23. int main(int argc, char **argv) {
24.     DIR *dirp;
25.     struct dirent *direntp;
26.     int stats;
27.     char buf[80];
28.     if (argc != 2) {
29.         printf("Usage:%s filename\n\a", argv[0]);
30.         exit(1);
31.     }
32.     if (((stats = get_file_size_time(argv[1])) == 0) || (stats == -1))exit(1);
33.     if ((dirp = opendir(argv[1])) == NULL) {
34.         printf("Open Directory %s Error:%s\n",
35.                 argv[1], strerror(errno));
36.         exit(1);
37.     }
38.     while ((direntp = readdir(dirp)) != NULL){
39.         sprintf(buf,"%s/%s",argv[1],direntp->d_name);
40.         if (get_file_size_time(buf) == -1)break;
41.     }
42.     closedir(dirp);
43.     exit(1);
44. }
45.

int _access(const char *pathname, int mode);位于<io.h>中

pathname 为文件路径或目录路径 mode 为访问权限

如果文件具有指定的访问权限,则函数返回0;如果文件不存在或者不能访问指定的权限,则返回-1.

mode的值和含义如下所示:

00——只检查文件是否存在

02——写权限

04——读权限

06——读写权限