【发布时间】: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