2015年8月4日 星期二

[Linux C] C語言檢查檔案是否存在


在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;
}

沒有留言:

張貼留言