总体概述
在linux系统环境下,实现对指定的目录下所有文件的遍历。需要用到的函数有opendir, readdir, closedir三个函数。
函数原型
opendir函数原型:DIR *opendir(const char *name); readdir函数原型:struct dirent *readdir(DIR *dirp); closedir函数原型:int closedir(DIR *dirp);
函数作用
opendir函数的作用:打开一个给定的目录文件,并返回目录流指针。 readdir函数的作用:读取一个指向dirent的结构体指针。 closedir函数的作用:关闭一个已经打开的目录流指针,与opendir成对出现。
参数介绍
opendir参数介绍:
- 输入参数:name => 传入目录的路径名。
- 返回值:DIR * => 成功:返回目录流指针;失败:返回 NULL。
readdir参数介绍:
- 输入参数:dirp => 打开的目录流指针,
readdir成功之后就会指向下一个目录的指针。 - 返回值:struct dirent * => 成功:返回目录结构体指针;失败或者到达目录流的末尾:返回 NULL。
closedir参数介绍:
- 输入参数:dirp => 打开的目录流指针
- 返回值:成功:返回 0;失败: 返回 -1。
补充:struct dirent 结构体的原型
struct dirent {
ino_t d_ino; /* inode number */
off_t d_off; /* not an offset; see NOTES */
unsigned short d_reclen; /* length of this record */
unsigned char d_type; /* type of file; not supported by all filesystem types */
char d_name[256]; /* filename */
};
代码示例
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <string.h>
int main(int argc, char **argv)
{
if (argc != 2) {
printf("usage: %s <pathname>\r\n", argv[0]);
return -1;
}
DIR *dirp = opendir(argv[1]);
if (!dirp) {
printf("open dir %s failed.\r\n", argv[1]);
return -1;
}
struct dirent *dirent;
while ((dirent = readdir(dirp))) {
if (!strcmp(dirent->d_name, ".") || !strcmp(dirent->d_name, ".."))
continue;
printf("%s\t", dirent->d_name);
}
printf("\n");
return closedir(dirp);
}
使用方法
$ mkdir ~/clanguage && cd ~/clanguage
$ touch directory.c 注:创建并拷贝代码到directory.c,保存退出。
$ gcc -o directory directory.c
$ ./directory ./ 注:显示当前目录下的文件
注:由于作者能力有限,文中表述难免有错误。如果发现文中错误之处,敬请广大好友批评指正。