"mkdir()" не работает

Привет, я пытаюсь создать функцию повторного копирования, которая эмулирует программу CP в Unix. Таким образом, в основном, если я запускаю программу с опцией -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/

Странно то, что я помещаю маркер printf внутри вызова mkdir, чтобы увидеть, что такое destPath, и форматирование не выглядит иначе, чем когда я вызываю программу, не использующую подфоллер. Что здесь происходит?

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и #defineи для реализации функции whatTypeТаким образом, все, что я пишу, предполагает, что у нас есть аналогичные определения для них.

Существует большая разница между вашим кодом и cp -r в Linux, который может объяснить проблему, свидетелем которой вы являетесь. Предположим, у вас есть существующая структура каталогов в src/ и что нет каталога с именем trg/, если вы выполните:

cp -r src trg

это приведет к полной структуре каталогов src/ копируется под trg/если у вас был файл src/f, это будет скопировано в trg/f,

С другой стороны, если изначально был каталог с именем trgто полная структура каталогов src/ будет скопирован под trg/src/то есть файл src/f будет скопирован в trg/src/f,

С вашим кодом поведение всегда второе. Ваш код предполагает, что целевой корневой каталог существует: первый каталог, который он пытается создать, всегда trg/src, Это не удастся, если trg/ не существует

Другие вопросы по тегам