使用 readdir
实现递归目录遍历通常涉及以下几个步骤:
opendir
打开当前目录。readdir
读取目录中的每一个条目。.
和 ..
这两个特殊目录项。closedir
关闭目录。下面是一个使用 C 语言实现的递归目录遍历的示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
// 函数声明
void recursive_readdir(const char *path);
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "用法: %s <目录路径>\n", argv[0]);
return EXIT_FAILURE;
}
const char *start_path = argv[1];
recursive_readdir(start_path);
return EXIT_SUCCESS;
}
void recursive_readdir(const char *path) {
DIR *dir = opendir(path);
if (dir == NULL) {
perror("无法打开目录");
return;
}
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
// 跳过当前目录和父目录
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
continue;
// 构建完整的路径
size_t len = strlen(path) + strlen(entry->d_name) + 2; // +1 for '/' and +1 for '\0'
char full_path[len];
snprintf(full_path, len, "%s/%s", path, entry->d_name);
struct stat st;
if (stat(full_path, &st) == -1) {
perror("无法获取文件状态");
continue;
}
if (S_ISDIR(st.st_mode)) {
// 如果是目录,递归遍历
printf("目录: %s\n", full_path);
recursive_readdir(full_path);
} else {
// 如果是文件,进行处理(这里以打印文件名为例)
printf("文件: %s\n", full_path);
}
}
closedir(dir);
}
主函数 (main
):
recursive_readdir
开始递归遍历。递归遍历函数 (recursive_readdir
):
opendir
打开指定路径的目录。readdir
逐个读取目录中的条目。.
和 ..
。snprintf
构建条目的完整路径。stat
获取条目的文件状态。recursive_readdir
。closedir
关闭目录。将上述代码保存为 recursive_readdir.c
,然后使用以下命令编译和运行:
gcc -o recursive_readdir recursive_readdir.c
./recursive_readdir /path/to/directory
替换 /path/to/directory
为你想要遍历的目标目录。
S_ISLNK
来避免这种情况。通过以上方法,你可以使用 readdir
实现递归目录遍历,适用于各种需要在程序中处理文件系统的场景。