5

我需要知道如何以八进制格式获取文件权限并将其保存到 int 中。我试过这样的事情:

struct stat buf;  
stat(filename, &buf);
int statchmod = buf.st_mode;
printf("chmod: %i\n", statchmod);

但他的输出是:

chmod: 33279

应该是777。

4

2 回答 2

10

33279 是八进制 100777 的十进制表示。您获得十进制表示是因为您通过格式标识符请求将数字打印为十进制%i%o将其打印为八进制数。

但是, st_mode 将为您提供更多信息。(因此100在开头。)您需要使用S_IRWXU(“用户”的rwx 信息)、S_IRWXG(组)和S_IRWXO(其他)常量来获得所有者、组和其他人的权限。它们分别在 700、070 和 007 处定义,均以八进制表示。将它们组合在一起并使用 AND 过滤掉指定的位将只产生您想要的数据。

因此最终的程序变成了这样:

struct stat buf;  
stat(filename, &buf);
int statchmod = buf.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO);
printf("chmod: %o\n", statchmod);

资源:

  1. 有关格式标识符的更多信息
  2. 相关常数
于 2013-01-14T20:09:36.460 回答
0

我喜欢@ilias 的回答。但是,如果您像我一样并且实际上想要完整的 chmod 值(例如完全保存和恢复原始文件权限),那么此例程将执行此操作,并确保前导零也不会被删除。

static std::string getChmodPerms(std::string sFile) {
    struct stat buf;
    stat(sFile.c_str(),&buf);
    int statchmod = buf.st_mode;
    char mybuff[50];
    sprintf(mybuff,"%#o",statchmod);
    std::string sResult(mybuff);
    return sResult;
}

它是 C++,但如果你愿意,转换成 C 是微不足道的。

于 2016-04-18T00:36:07.160 回答