5

ファイルのアクセス許可を 8 進数形式で取得し、それを 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 は、8 進数の 100777 の 10 進数表現です。フォーマット ID を使用して数値を 10 進数として出力するように要求したため、10 進数表現が得られます%i%o8進数として出力します。

ただし、st_mode を使用すると、さらに多くの情報が得られます。(したがって、100最初に。)S_IRWXU(「ユーザー」のrwx情報)、S_IRWXG(グループ)、およびS_IRWXO(その他)の定数を使用して、所有者、グループ、およびその他の把握したパーミッションを取得する必要があります。これらはそれぞれ 700、070、および 007 で定義され、すべて 8 進表現です。これらを OR し、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 に答える