2013-01-14 22 views
4

我需要知道如何以八進制格式獲取文件權限並將其保存爲int。我想是這樣的:如何從c中的stat()獲得八進制chmod格式

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

但他產量爲:

chmod: 33279 

,應該是777

+1

一個非常快速和簡單的搜索會找到你參考頁面,像[這一個](http://en.cppreference.com/w/c/io/fprintf),你可以看到所有的格式代碼。更容易的是使用'man printf'命令。 –

回答

6

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. More about format identifiers
  2. Related constants
+0

感謝您的答案,但我需要chmod比較一個輸入,輸入將是int「777」,並搜索具有chmod 777的文件。如何在輸入爲十進制時比較這兩個變量,而它是八進制表示的chmod正在找? – user1827257

+0

你可以在C中使用八進制值,只需在0前添加一個值即可。例如,0777.然後,您可以簡單地測試相等性如果(statchmod == 0777){...}' – ilias

+1

@ user1827257十進制和八進制只是與字符串表示相關。在內部,該值以硬件使用的任何格式存儲[二進制,除非發生非常奇怪的事情]。要查看ugo權限是否爲777,只需檢查'(statchmod&0777)== 0777'。 –

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是微不足道的。