C - 递归复制文件

时间:2016-02-28 12:34:15

标签: c recursion stat

我不知道为什么,但我找不到问题所在。我运行测试以查看它是目录还是文件,甚至文件也被视为文件夹。

问题是,即使对于文件运行循环,它也会进入目录进程和postrs"目录"

的file1

以下是代码:

void copie_dossier(char *doss1, char *doss2) {
    struct dirent *dptr;
    DIR *dp;
    struct stat stbuf;

    char newDest[strlen(doss2) + 1];
    char tempSrc[strlen(doss1) + 1];
    strcat(doss2, "/");
    strcat(doss1, "/");
    strcpy(newDest, doss2);
    strcpy(tempSrc, doss1);

    stat(doss1, &stbuf);

    dp = opendir(doss1);

    /*
    if (!dp) {
       perror("open_dir");
       exit(1);
    }
    */

    if (!(dp))
        return;
    if (!(dptr = readdir(dp)))
        return;

    int mk = mkdir(doss2, 0777);
    if (mk == -1) {
        perror("create_dir");
        exit(1);
    }

    while ((dptr = readdir(dp)) != NULL) {
        struct stat stbuf2;
        //stat(dptr->d_name, &stbuf2);
        char *new = dptr->d_name;

        if (!strcmp(dptr->d_name, ".") || !strcmp(dptr->d_name, "..")) {
            continue;
        }

        if (!stat(tempSrc, &stbuf2)) {
            if (S_ISREG(stbuf.st_mode)) {
                printf("%s for files\n", dptr->d_name);
                strcat(newDest, dptr->d_name);
                strcat(tempSrc, dptr->d_name);
                copy_files(tempSrc, newDest);
                strcpy(newDest, doss2);
                strcpy(tempSrc, doss1);
            }

            if (S_ISDIR(stbuf.st_mode)) {
                printf("%s for directory \n", dptr->d_name);
                strcat(newDest, dptr->d_name);
                strcat(tempSrc, dptr->d_name);
                copie_dossier(tempSrc, newDest);
                strcpy(newDest, doss2);
                strcpy(tempSrc, doss1);
            } 
        }
    }
    closedir(dp);
}

1 个答案:

答案 0 :(得分:1)

问题在于分配本地缓冲区:

char newDest[strlen(doss2) + 1];
char tempSrc[strlen(doss1) + 1];
strcat(doss2, "/");
strcat(doss1, "/");
strcpy(newDest, doss2);
strcpy(tempSrc, doss1);

即使第一次使用newDesttempSrc,也会在复制不适合目标的字符串时调用未定义的行为。 newDesttempSrc分别用于doss1doss2中的字符数(最后为'\0'),但您追加了/ stat()复制前1}}。

稍后在代码中,您将连接目录条目名称,从而导致进一步的未定义行为。

您必须更改路径名组合的逻辑。您可以使用内存分配或全局缓冲区来连接条目,同时记住用于结束的路径名将其剥离回以前的状态。

您的目录/文件名测试还有另一个大问题:您没有stbuf2正确的路径名,而是使用单独的stbuf而不是stat()。您应首先创建当前条目的路径名,将其传递给stbuf并检查生成的char *make_path(const char *path, const char *name) { size_t len = strlen(path); char *p = malloc(len + 1 + strlen(name) + 1); if (p) { strcpy(p, path); p[len] = '/'; strcpy(p + len + 1, name); } return p; } void copie_dossier(const char *doss1, const char *doss2) { DIR *dp; struct dirent *dptr; dp = opendir(doss1); if (dp == NULL) return; int mk = mkdir(doss2, 0777); if (mk == -1) { perror("create_dir"); exit(1); } while ((dptr = readdir(dp)) != NULL) { struct stat stbuf; char *source, *dest; if (!strcmp(dptr->d_name, ".") || !strcmp(dptr->d_name, "..")) { continue; } source = makepath(doss1, dptr->d_name); dest = makepath(doss2, dptr->d_name); if (!source || !dest) { perror("makepath"); exit(1); } if (!stat(source, &stbuf)) { if (S_ISREG(stbuf.st_mode)) { printf("%s for files\n", dptr->d_name); copy_files(source, dest); } else if (S_ISDIR(stbuf.st_mode)) { printf("%s for directory \n", dptr->d_name); copie_dossier(source, dest); } } else { // should issue a diagnostic message } free(source); free(dest); } closedir(dp); } 上的目录和文件名。

以下是改进版本:

copy_files

您没有发布函数Object.defineProperties(this, { width: { get: function(){ return this.right - this.left; }, }, }); 的代码。我假设它复制了一个文件,尽管名称。