Linux 目录遍历方法

记录一下 Linux 下目录的遍历方法。

API 原型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <sys/types.h>
#include <dirent.h>

struct dirent {
ino_t d_ino; /* Inode number */
off_t d_off; /* Not an offset; see below */
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]; /* Null-terminated filename */
};

DIR *opendir(const char *name);
DIR *fdopendir(int fd);
struct dirent *readdir(DIR *dirp);

函数说明

函数opendir()根据name打开一个目录流,返回一个指向该目录流的指针。
fdopendir()opendir()的不同在于接收一个文件描述符作为参数,如果调用成功,作
为参数的描述符会被内部使用,应用程序不应该再使用该描述符。

函数readdir()返回指向目录流dirp中下一个记录的指针,出错或流结束时返回NULL
以下是一个示例程序。

示例程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <dirent.h>

#define CUR_DIR "."

int main(int argc, char *argv[])
{
struct dirent *dir;
DIR *dir_stream;
char *dirpath;
char type;

if (argc == 1) {
dirpath = CUR_DIR;
} else {
dirpath = argv[1];
}
dir_stream = opendir(dirpath);
if (!dir) {
perror("opendir error");
exit(1);
}

while ((dir = readdir(dir_stream)) != NULL) {
switch (dir->d_type) {
case DT_REG:
type = '-'; break;
case DT_DIR:
type = 'd'; break;
default:
type = 's'; break; /* s for special */
}
printf("%c %s\n", type, dir->d_name);
}

return 0;
}
0%