"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/
не существует