【问题标题】:"mkdir()" not working“mkdir()”不工作
【发布时间】:2013-09-19 15:57:00
【问题描述】:

您好,我正在尝试创建一个在 unix 中模拟 CP 程序的递归复制函数。所以基本上,如果我使用 -r 选项运行程序,它将复制一个包含所有子目录的文件夹。我正在使用以下功能。

void copyDirectory(char *destDir, char *dirName)
{
    printf("copyDirectory run \n");

    int charCnt;
    int srcFd;
    int dstFd;
    char* sourcePath;
    char* destPath;

    DIR *dir = opendir(dirName);
    if(dir == NULL){
        return;
    }

    char Path[256], *EndPtr = Path;

    struct dirent *e;
    strcpy(Path, dirName);

    EndPtr += (strlen(dirName)+1);
    while((e = readdir(dir)) != NULL){
        sourcePath = malloc(strlen(Path)+1+strlen(e->d_name));
        destPath = malloc(strlen(destDir)+1+strlen(Path));
        strcpy(destPath, destDir);
        strcat(destPath, slash);
        strcat(destPath, Path);

        if (0 != access(destPath, F_OK)) {
            mkdir(destPath,0777);
            printf("mkdir %s \n", destPath);
        }

        strcpy(sourcePath, Path);
        strcat(sourcePath, slash);
        strcat(sourcePath, e->d_name);

        printf("copyDirectory destPath = %s \n", destPath);
        printf("copyDirectory sourcePath = %s \n", sourcePath);

        if(strcmp(e->d_name, dott) == 0){
            continue;
        }
        if(strcmp(e->d_name, dot) == 0){
            continue;
        }


        if(whatType(sourcePath) == 1){
            copyDirectory(destDir, sourcePath);   
        }
        else{
            /* copyFile(destPath, sourcePath);*/
        } 

        free(sourcePath);
        free(destPath);
    }
}

如果我使用以下命令行运行程序,这似乎可以正常工作。

Mycopy Sourcefolder/ DestinationFoler/

但是当我使用这个命令行运行它时,我的程序中的 mkdir 函数停止工作。

Mycopy Sourcefolder/Subfolder/ DestinationFoler/

奇怪的是,我在 mkdir 调用中放置了一个 printf 标记,以查看 destPath 是什么,并且格式看起来与我调用不使用子文件夹的程序时没有什么不同。怎么回事?

【问题讨论】:

  • 如果有一种方法可以测试mkdir 的返回结果,它会提示您失败的原因......
  • @Duck 表示测试返回码,检查 errno 看看为什么会失败。 +1 讽刺。但是你永远不知道这里的海报什么时候不会因为背景不同而变得如此幽默......
  • @jim mcnamara - 你对不同背景的看法是对的,我有时会因为忽视而感到内疚,但我并没有像讽刺“我应该问自己的下一个问题是什么而不是跑到堆栈溢出?”也许我在年老时变得暴躁,但最近返回码问题已成为一个小问题。为什么在学校和其他编程来源中没有更多地强调这一点?
  • 实际上我得到了 sarcarsm 并且已经测试了错误返回,发现我的 destPath 是错误的。我需要它到 mkdir DestinationFolder/Subfolder,而不是 DestinationFolder/SourceFolder/SubFoloder。我怎么做?我试着把 strcat(destPath, basename(Path));但是,如果我只有一个子目录,但如果我有更深的目录树,就会弄乱目录。

标签: c copy mkdir subdirectory


【解决方案1】:

测试函数和系统调用(如mkdir)的返回值始终是一个好习惯。这会发现我在下面解释的代码中的(可能的)错误。

if (0 != mkdir(destPath,0777)) {
  printf("When executing: mkdir(\"%s\")\n", destPath);
  perror("mkdir");
  exit(1);
}

这样你会看到:

When executing: mkdir("trg/src")
mkdir: No such file or directory

您的代码似乎工作正常。为了测试它,我必须添加一些#include's 和#define's 并实现函数whatType,所以我写的所有东西都假设我们对它们有类似的定义。

您的代码与 Linux 中的 cp -r 之间存在很大差异,这可以解释您所看到的问题。假设您在src/ 下有一个现有的目录结构,并且没有目录 名为trg/。如果你执行:

cp -r src trg

这将导致完整的目录结构src/被复制到trg/下,也就是说,如果你有一个文件src/f,这将被复制到trg/f

另一方面,如果最初有一个目录名为trg,那么完整的目录结构src/将被复制到trg/src/下,即文件src/f将被复制到trg/src/f

使用您的代码,行为始终是第二个。您的代码假定目标根目录存在:它尝试创建的第一个目录始终是trg/src。如果trg/ 尚不存在,则会失败。

【讨论】:

  • 其实这就是我的目标。如果目录存在,它应该创建 trg/src/file,但我遇到的问题是当我尝试将 src/subfolder/ 复制到 trg 时,它应该尝试 mkdir trg/subfolder,而不是 trg/src/subfolder
  • 有没有一种简单的方法可以使用 / 作为分隔符从字符串中删除第一个单词?
  • 函数strchr(s, c) 将在字符串s 中查找字符c 的第一次出现并返回指向该字符的指针,如果不存在则返回NULL。该指针加一会删除第一个单词。
猜你喜欢
  • 2015-09-24
  • 2011-03-07
  • 2017-07-30
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
  • 2016-01-28
  • 1970-01-01
  • 2012-09-16
相关资源
最近更新 更多