您好我正在尝试创建一个复制复制功能,模拟unix中的CP程序。所以基本上如果我使用-r选项运行程序,它将复制一个包含所有子目录的文件夹。我正在使用folling函数。
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是什么,格式看起来与我调用不使用subfoler的程序时没有什么不同。发生了什么事?
答案 0 :(得分:3)
测试函数和系统调用的返回值(例如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
,所以我写的所有内容都假定我们对这些有相似的定义。
您的代码与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/
尚不存在,则会失败。