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 d_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()。 |
http://www.liweifan.com/2012/05/13/linux-system-function-files-operation/
最近在看Linux下文件操作相关章节,遇到了这么几个结构体,被搞的晕乎乎的,今日有空,仔细研究了一下,受益匪浅。
首先说说DIR这一结构体,以下为DIR结构体的定义:
DIR结构体类似于FILE,是一个内部结构,以下几个函数用这个内部结构保存当前正在被读取的目录的有关信息(摘自《UNIX环境高级编程(第二版)》)。函数 DIR *opendir(const char *pathname),即打开文件目录,返回的就是指向DIR结构体的指针,而该指针由以下几个函数使用:
关于DIR结构,我们知道这么多就可以了,没必要去再去研究他的结构成员。
接着是dirent结构体,首先我们要弄清楚目录文件(directory file)的概念:这种文件包含了其他文件的名字以及指向与这些文件有关的信息的指针(摘自《UNIX环境高级编程(第二版)》)。从定义能够看出,dirent不仅仅指向目录,还指向目录中的具体文件,readdir函数同样也读取目录下的文件,这就是证据。以下为dirent结构体的定义:
从上述定义也能够看出来,dirent结构体存储的关于文件的信息很少,所以dirent同样也是起着一个索引的作用,如果想获得类似ls -l那种效果的文件信息,必须要靠stat函数了。
通过readdir函数读取到的文件名存储在结构体dirent的d_name成员中,而函数
int stat(const char *file_name, struct stat *buf);
的作用就是获取文件名为d_name的文件的详细信息,存储在stat结构体中。以下为stat结构体的定义:
这个记录的信息就很详细了吧,呵呵。
最后,总结一下,想要获取某目录下(比如a目下)b文件的详细信息,我们应该怎样做?
首先,我们使用opendir函数打开目录a,返回指向目录a的DIR结构体c。
接着,我们调用readdir(c)函数读取目录a下所有文件(包括目录),返回指向目录a下所有文件的dirent结构体d。
然后,我们遍历d,调用stat(d->name,stat *e)来获取每个文件的详细信息,存储在stat结构体e中。
总体就是这样一种逐步细化的过程,在这一过程中,三种结构体扮演着不同的角色。
下面我们开发一个小程序,这个程序有一个参数.如果这个参数是一个文件名,我们输出这个文件的大小和最后修改的时间,如果是一个目录我们输出这个目录下所有文件的大小和修改时间.
int _access( const char *path, int mode );
Return Value
Each of these functions returns 0 if the file has the given mode. The function returns –1 if the named file does not exist or is not accessible in the given mode; in this case, errno is set as follows:
EACCES
Access denied: file’s permission setting does not allow specified access.
ENOENT
Filename or path not found.
Parameters
path
File or directory path
mode
Permission setting
Remarks
When used with files, the _access function determines whether the specified file exists and can be accessed as specified by the value of mode. When used with directories, _access determines only whether the specified directory exists; in Windows NT, all directories have read and write access.
mode Value Checks File For
00 Existence only
02 Write permission
04 Read permission
06 Read and write permission