在C上是有函式可以檢查該process是否有足夠權限存取某個檔案的。
該函式叫做access(const char *pathname, int mode)
來檢單看一下man page上關於access函式的介紹吧!
--
- 函式簡介
首先我們可以看到access的函式型態是:
int access(const char *pathname, int mode);
第二個代入的參數是要檢查的Mode。
路徑就不用說了,第二個Mode參數我們來看一下他在source code內的定義:
我們可以看到Mode總共有四種:
(1) R_OK --> 檢查該Process是否俱有對該檔案讀取的權限。
(2) W_OK -->檢查該Process是否俱有對該檔案寫入的權限。
(3) X_OK --> 檢查該Process是否俱有對該檔案執行的權限。
(4) F_OK --> 檢查該檔案是否存在。
- 函式回傳:
當輸入的所有權限都符合時會回傳0,如果有任一不符合的話會回傳-1,並且errno會被設定成相對應的錯誤。
注意:W_OK在Windows上是不安全的,有可能在Windows上檔案無法寫入,但是卻是回傳Success哦!
- 程式用法
要使用這個函式最簡單可以使用下圖所顯示的這樣。
if( access( fname, F_OK ) != -1 ) {
// file exists
} else {
// file doesn't exist
}
若是想要同時檢查多於一個權限以上該怎麼使用函式呢?答案是使用OR的邏輯運算,例如:
access( fname, F_OK | R_OK | W_OK);
這樣就可以一次檢查多種權限囉!
--
接下來來個簡單的程式範例吧!假設我的桌面上有一個檔案叫做a.c,我想要檢查他是否存在,可以使用下列程式測得:
#include <stdio.h> #include <unistd.h> #define KRED "\033[0;32;31m" #define KGRN "\033[0;32;32m" #define RESET "\033[0m" int main(void) { const char *path = "/home/a/Desktop/a.c"; printf("Program ready to check file %s\n", path); if ( access(path, F_OK) != -1) { printf(KGRN"File '%s' exist.\n"RESET, path); } else { printf(KRED"File '%s' doesn't exist.\n"RESET, path); } return 0; }
沒有留言:
張貼留言