以下是我的方法代码,该方法将文件从路径复制到文件到作为目标提供的目录。副本工作正常,但是我的chmod调用将错误的权限分配给目标中的复制文件。如果源中的权限为644,则复制的文件的权限为170或120。
我已经尝试调试了好几个小时,这让我有点发疯,因此,非常感谢您的帮助。
void copy_file(char* src, char* dest) {
char a;
//extract file name through a duplicate ptr
char* fname = strdup(src);
char* dname = basename(fname);
//open read and write streams
FILE* read;
FILE* write;
read = fopen(src, "r");
chdir(dest);
write = fopen(dname, "w");
//error checking
if (read == NULL) //|| (write == NULL))
{
perror("Read Error: ");
exit(0);
}
else if (write == NULL)
{
perror("Write Error: ");
exit(0);
}
//write from src to dest char by char
while (1){
a = fgetc(read);
if (a == EOF)
{
break;
}
fputc(a, write);
}
//close files
fclose(read);
fclose(write);
// this is where I attempt to assign source file permissions
//and it goes horribly wrong
struct stat src_st;
if(stat(src, &src_st)){
perror("stat: ");
}
chmod(dname, src_st.st_mode);
printf("%o\n", src_st.st_mode & 0777);
}
最佳答案
您fopen(src, "r")
,然后您chdir(dest)
。这意味着,当您以后调用stat(src, &src_st)
时,没有理由认为stat
将访问与fopen
相同的文件,或者实际上stat
将完全访问任何文件。
如果stat
失败,则无论如何都会继续调用chmod
,因此您会将src_st.st_mode
中的任何随机垃圾传递给chmod
。
您应该在调用fstat(fileno(read), &src_st)
之前使用fclose(src)
,而不是调用stat(src, &src_st)
。
关于c - C中的Chmod分配错误的权限,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42890656/