我不知道为什么,但我找不到问题所在。我运行测试以查看它是目录还是文件,甚至文件也被视为文件夹。
问题是,即使对于文件运行循环,它也会进入目录进程和postrs"目录"
的file1以下是代码:
void copie_dossier(char *doss1, char *doss2) {
struct dirent *dptr;
DIR *dp;
struct stat stbuf;
char newDest[strlen(doss2) + 1];
char tempSrc[strlen(doss1) + 1];
strcat(doss2, "/");
strcat(doss1, "/");
strcpy(newDest, doss2);
strcpy(tempSrc, doss1);
stat(doss1, &stbuf);
dp = opendir(doss1);
/*
if (!dp) {
perror("open_dir");
exit(1);
}
*/
if (!(dp))
return;
if (!(dptr = readdir(dp)))
return;
int mk = mkdir(doss2, 0777);
if (mk == -1) {
perror("create_dir");
exit(1);
}
while ((dptr = readdir(dp)) != NULL) {
struct stat stbuf2;
//stat(dptr->d_name, &stbuf2);
char *new = dptr->d_name;
if (!strcmp(dptr->d_name, ".") || !strcmp(dptr->d_name, "..")) {
continue;
}
if (!stat(tempSrc, &stbuf2)) {
if (S_ISREG(stbuf.st_mode)) {
printf("%s for files\n", dptr->d_name);
strcat(newDest, dptr->d_name);
strcat(tempSrc, dptr->d_name);
copy_files(tempSrc, newDest);
strcpy(newDest, doss2);
strcpy(tempSrc, doss1);
}
if (S_ISDIR(stbuf.st_mode)) {
printf("%s for directory \n", dptr->d_name);
strcat(newDest, dptr->d_name);
strcat(tempSrc, dptr->d_name);
copie_dossier(tempSrc, newDest);
strcpy(newDest, doss2);
strcpy(tempSrc, doss1);
}
}
}
closedir(dp);
}
答案 0 :(得分:1)
问题在于分配本地缓冲区:
char newDest[strlen(doss2) + 1];
char tempSrc[strlen(doss1) + 1];
strcat(doss2, "/");
strcat(doss1, "/");
strcpy(newDest, doss2);
strcpy(tempSrc, doss1);
即使第一次使用newDest
和tempSrc
,也会在复制不适合目标的字符串时调用未定义的行为。 newDest
和tempSrc
分别用于doss1
和doss2
中的字符数(最后为'\0'
),但您追加了/
stat()
复制前1}}。
稍后在代码中,您将连接目录条目名称,从而导致进一步的未定义行为。
您必须更改路径名组合的逻辑。您可以使用内存分配或全局缓冲区来连接条目,同时记住用于结束的路径名将其剥离回以前的状态。
您的目录/文件名测试还有另一个大问题:您没有stbuf2
正确的路径名,而是使用单独的stbuf
而不是stat()
。您应首先创建当前条目的路径名,将其传递给stbuf
并检查生成的char *make_path(const char *path, const char *name) {
size_t len = strlen(path);
char *p = malloc(len + 1 + strlen(name) + 1);
if (p) {
strcpy(p, path);
p[len] = '/';
strcpy(p + len + 1, name);
}
return p;
}
void copie_dossier(const char *doss1, const char *doss2) {
DIR *dp;
struct dirent *dptr;
dp = opendir(doss1);
if (dp == NULL)
return;
int mk = mkdir(doss2, 0777);
if (mk == -1) {
perror("create_dir");
exit(1);
}
while ((dptr = readdir(dp)) != NULL) {
struct stat stbuf;
char *source, *dest;
if (!strcmp(dptr->d_name, ".") || !strcmp(dptr->d_name, "..")) {
continue;
}
source = makepath(doss1, dptr->d_name);
dest = makepath(doss2, dptr->d_name);
if (!source || !dest) {
perror("makepath");
exit(1);
}
if (!stat(source, &stbuf)) {
if (S_ISREG(stbuf.st_mode)) {
printf("%s for files\n", dptr->d_name);
copy_files(source, dest);
} else
if (S_ISDIR(stbuf.st_mode)) {
printf("%s for directory \n", dptr->d_name);
copie_dossier(source, dest);
}
} else {
// should issue a diagnostic message
}
free(source);
free(dest);
}
closedir(dp);
}
上的目录和文件名。
以下是改进版本:
copy_files
您没有发布函数Object.defineProperties(this, {
width: {
get: function(){
return this.right - this.left;
},
},
});
的代码。我假设它复制了一个文件,尽管名称。