我遇到了以下代码运行以递归复制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
}
}
}
}
}
答案 0 :(得分:0)
看起来它没有在基目录和附加部分之间插入目录分隔符(/
)。
假设name = "/home/foo/bar"
,EndPtr
将指向最后的'\0'
,然后e->d_name
被复制到那里,中间没有任何内容。这是错误的,它会创建一个混合文件名。
答案 1 :(得分:0)
我自己无法测试你的代码,我没有安装正确的库。但是 有一个示例可能对使用opendir et的 here 有所帮助。人