c - 当尝试在 C 中递归导航目录时,为什么会出现段错误?

标签 c recursion dirent.h

这是我的 op/sys 类中的一个项目。 我的最终目标是递归复制目录。

下面的函数在看到目录时会导致段错误。 我还没有使用复制功能。我只是想把导航放下来。 source 是我正在导航的目录,dest 目前是一个占位符。

当 dp 是目录时,它在箭头处失败。

static void clone(const char* source, const char* dest){
    DIR *dirp;
    struct dirent *dp;
    dirp = opendir(source);
    dp = readdir(dirp);
    while (dp != NULL){
        if (strcmp(dp->d_name, "..") && strcmp(dp->d_name, "."))
        switch (dp->d_type) {
            case DT_DIR:
                printf("dir: %s\n", dp->d_name);
                //saved for making copy
->              clone(dp->d_name, dest);
                break;
            default:
                printf("fil: %s\n", dp->d_name);
                break;
        }
        dp = readdir(dirp);
    }
    closedir(dirp);
}

编辑:

我讨厌这样:我花几个小时解决一个问题,然后寻求帮助,然后立即让它工作。答案如下。

最佳答案

我将其更改为传递下一个目录的完整路径,而不是相对路径。

static void clone(const char* source, const char* dest){
    DIR *dirp;
    struct dirent *dp;
    dirp = opendir(source);
    dp = readdir(dirp);
    while (dp != NULL){
        char rsource[512];
        strcpy(rsource, source);
        strcat(rsource, "/");
        strcat(rsource, dp->d_name);

        if (strcmp(dp->d_name, "..") && strcmp(dp->d_name, "."))
        switch (dp->d_type) {
            case DT_DIR:
                printf("dir: %s\n", dp->d_name);
                //saved for making copy

                clone(rsource, dest);
                break;
            default:
                printf("fil: %s\n", dp->d_name);
                break;
        }
        dp = readdir(dirp);
    }
    closedir(dirp);
}

关于c - 当尝试在 C 中递归导航目录时,为什么会出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23173969/

相关文章:

跟踪 tibble 中连接文档的递归函数不会停止

c++ dirent.h 和获取绝对路径的语法

java - QUICKSORT : how to resolve java. lang.StackOverflowError?

c - SDL2 加载嵌入的二进制文件

c - getopt() 中的 optarg 始终为 null

c - c中存储任何数据类型的二叉树

java - 查找 char 数组中 'A' 的最长路径

c++ - 在目录中搜索文件夹

检查一个目录。 readdir 返回的条目是目录、链接或文件。 dent->d_type 没有显示类型

c - 谢尔宾斯基三角形: program not functioning properly