C子文件夹的递归目录副本

时间:2013-09-10 11:07:17

标签: c recursion copy

我遇到了以下代码运行以递归复制C中的子文件夹的问题。我在另一篇文章中看到了这一点,但代码似乎没有运行if语句来检查当前文件是否是目录。

void SearchDirectory(const char *name) {
DIR *dir = opendir(name);                
if(dir) {
    char Path[256], *EndPtr = Path;
    struct dirent *e;
    strcpy(Path, name);                  
    EndPtr += strlen(name);              
    while((e = readdir(dir)) != NULL) {  
        struct stat info;                
        strcpy(EndPtr, e->d_name);       
        if(!stat(Path, &info)) {         //code stops here and won't check if the current file is a directory or not..
            if(S_ISDIR(info.st_mode)) {  

                SearchDirectory(Path);   
            } else if(S_ISREG(info.st_mode) { 
                //Copy routine
            }
        }
    }
}

}

修改

所以我在路径的末尾添加了一个斜杠,它似乎找到了目录,但在执行时崩溃了堆栈错误。我认为这是无止境的递归。新代码是:

void SearchDirectory(const char *name) {
DIR *dir = opendir(name);                
if(dir) {
    char Path[256], *EndPtr = Path;
    struct dirent *e;
    strcpy(Path, name);   
strcat(Path, slash);               
    EndPtr += (strlen(name)+1);              
    while((e = readdir(dir)) != NULL) {  
        struct stat info;                
        strcpy(EndPtr, e->d_name);       
        if(!stat(Path, &info)) {         //code stops here and won't check if the current file is a directory or not..
            if(S_ISDIR(info.st_mode)) {  

                SearchDirectory(Path);   
            } else if(S_ISREG(info.st_mode) { 
                //Copy routine
            }
        }
    }
}

}

2 个答案:

答案 0 :(得分:0)

看起来它没有在基目录和附加部分之间插入目录分隔符(/)。

假设name = "/home/foo/bar"EndPtr将指向最后的'\0',然后e->d_name被复制到那里,中间没有任何内容。这是错误的,它会创建一个混合文件名。

答案 1 :(得分:0)

我自己无法测试你的代码,我没有安装正确的库。但是 有一个示例可能对使用opendir et的 here 有所帮助。人