获取基本文件权限以与C中的输入进行比较

时间:2013-11-01 17:12:15

标签: c file-permissions

我需要将文件的基本文件权限与输入的文件权限进行比较。输入应保存在argv[1]中,文件中的权限信息存储在经典struct stat stat_buf中,特别是stat_buf.st_mode字段中。

执行的一个例子是./program 775。然后程序必须说这是代码中某些文件stat_buf.st_mode的相同权限。但我所知道的是st_mode的格式很棘手,因为它必须被读作八进制,将其转换为int,依此类推。如何比较没有问题?

2 个答案:

答案 0 :(得分:1)

我的方法是构建一个名为oct的函数,它接受stat_buf.st_mode,以八进制模式将其复制到缓冲区,然后再将其复制到其他缓冲区以消除我不想要的信息(前3个数字)最后使用strtol函数得到十进制数,以便与输入进行比较。

int oct(mode_t num) {
    int i;
    char buffer[7], buffer2[4];
    snprintf(buffer, 8, "%o", num);
    for(i = 0; i < strlen(buffer2); i++)
        buffer2[i] = buffer[i + 2];
    return strtol(buffer2, NULL, 10);
}

如何测试:

int main() {
    int mode1, mode2;
    struct stat stat_buf;
    stat("/home/user/myfile", &stat_buf);
    mode1 = atoi(argv[1]);
    mode2 = oct(stat_buf.st_mode);
    printf("%d %d\n", mode1, mode2);
    return 0;
}

示例:执行./program 775作为输出775 775

答案 1 :(得分:1)

  

格式st_mode很棘手,因为它必须被读作八进制[...]

不是特别的。只需使用strtoul()和适当的基础(8):

unsigned long mode = strtoul(argv[1], NULL, 8);
if (statbuf.st_mode == mode) {
    // permissions match
}