使用C语言编程,使用函数的递归调用,遍历一个文件夹下的所有文件

在这段代码中,我们定义了一个 traverse_path 函数来递归遍历指定路径下的所有文件和文件夹。

首先,我们使用 opendir 函数打开指定的路径,并将返回的目录指针保存在变量 dir 中。如果无法打开路径,则输出提示信息并返回函数。

然后,我们使用 readdir 函数循环读取路径下的每个目录项。对于每个目录项,我们构建完整的文件/文件夹路径,并使用 stat 函数获取其相关信息,如文件类型等。

如果该目录项是文件夹(通过 S_ISDIR 宏判断),我们检查它是否为当前目录(“.”)或上级目录(“…”),如果是则忽略。然后,我们输出 “文件夹:” + 文件夹名 的信息,并递归调用 traverse_path 函数,传入子文件夹路径作为参数。

如果该目录项是文件(通过 S_ISREG 宏判断),我们直接输出 “文件:” + 文件名 的信息。

最后,我们使用 closedir 函数关闭目录指针。

在主函数中,我们首先使用 scanf 函数接收用户输入的路径,并将其存储在字符串数组 path 中。然后,我们调用 traverse_path 函数,将路径作为参数传递给它。

这样,当我们运行程序并输入有效路径后,它将递归地遍历路径下所有的文件和文件夹,并按照要求输出每个文件或文件夹的类型以及名称。

代码片:

#include 
#include 
#include 
#include 

void traverse_path(const char *path) {
    DIR *dir;
    struct dirent *entry;
    struct stat statbuf;

    // 打开目录
    dir = opendir(path);
    if (dir == NULL) {
        printf("无法打开目录\n");
        return;
    }

    while ((entry = readdir(dir)) != NULL) {
        char file_path[1024];
        snprintf(file_path, sizeof(file_path), "%s/%s", path, entry->d_name);

        // 获取文件/文件夹信息
        if (stat(file_path, &statbuf) == -1) {
            continue;
        }

        if (S_ISDIR(statbuf.st_mode)) {
            // 是文件夹
            if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
                continue;  // 忽略当前目录和上级目录
            }
            printf("文件夹:%s\n", entry->d_name);

            // 递归遍历子文件夹
            traverse_path(file_path);
        } else if (S_ISREG(statbuf.st_mode)) {
            // 是文件
            printf("文件:%s\n", entry->d_name);
        }
    }

    // 关闭目录
    closedir(dir);
}

int main() {
    char path[1024];
    printf("请输入有效的路径:");
    scanf("%s", path);
    
    traverse_path(path);

    return 0;
}

你可能感兴趣的:(C/C++,c语言,开发语言)