以下是我的方法代码,该方法将文件从路径复制到文件到作为目标提供的目录。副本工作正常,但是我的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/

10-13 07:03