我需要知道如何以八進制格式獲取文件權限並將其保存爲int。我想是這樣的:如何從c中的stat()獲得八進制chmod格式
struct stat buf;
stat(filename, &buf);
int statchmod = buf.st_mode;
printf("chmod: %i\n", statchmod);
但他產量爲:
chmod: 33279
,應該是777
我需要知道如何以八進制格式獲取文件權限並將其保存爲int。我想是這樣的:如何從c中的stat()獲得八進制chmod格式
struct stat buf;
stat(filename, &buf);
int statchmod = buf.st_mode;
printf("chmod: %i\n", statchmod);
但他產量爲:
chmod: 33279
,應該是777
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);
資源:
感謝您的答案,但我需要chmod比較一個輸入,輸入將是int「777」,並搜索具有chmod 777的文件。如何在輸入爲十進制時比較這兩個變量,而它是八進制表示的chmod正在找? – user1827257
你可以在C中使用八進制值,只需在0前添加一個值即可。例如,0777.然後,您可以簡單地測試相等性如果(statchmod == 0777){...}' – ilias
@ user1827257十進制和八進制只是與字符串表示相關。在內部,該值以硬件使用的任何格式存儲[二進制,除非發生非常奇怪的事情]。要查看ugo權限是否爲777,只需檢查'(statchmod&0777)== 0777'。 –
我喜歡@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是微不足道的。
一個非常快速和簡單的搜索會找到你參考頁面,像[這一個](http://en.cppreference.com/w/c/io/fprintf),你可以看到所有的格式代碼。更容易的是使用'man printf'命令。 –