函數原型
#include <unistd.h>
int access(const char *pathname, int mode);
參數說明:
pathname:是文件的路徑名+文件名,指定要測試的文件。文件的路徑名可以是絕對路徑也可以是相對路徑。
mode:指明測試哪種權限,有下面4種權限:
- F_OK 值爲0,判斷文件是否存在
- R_OK 值爲4,判斷對文件是否有讀權限
- W_OK 值爲2,判斷對文件是否有寫權限
- X_OK 值爲1,判斷對文件是否有可執行權限
返回值:當判斷具有權限時,返回0;否則返回-1,並且errno被設置爲以下的某個值:
EINVAL: 模式值無效
EACCES: 文件或路徑名中包含的目錄不可訪問
ELOOP : 解釋路徑名過程中存在太多的符號連接
ENAMETOOLONG:路徑名太長
ENOENT: 路徑名中的目錄不存在或是無效的符號連接
ENOTDIR: 路徑名中當作目錄的組件並非目錄
EROFS: 文件系統只讀
EFAULT: 路徑名指向可訪問的空間外
EIO: 輸入輸出錯誤
ENOMEM: 不能獲取足夠的內核內存
ETXTBSY:對程序寫入出錯
示例程序
/*
*程序描述:使用access()函數對指定文件進行文件權限的檢查操作。
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
int file_check(char *dir, char *filename)
{
char full_filename[512]={0};
snprintf(full_filename, 512, "%s/%s", dir, filename);
printf("full_filename = %s\n", full_filename);
if(access(full_filename, F_OK)){
printf("check error: %s\n", strerror(errno));
return -1;
}
if(access(full_filename, R_OK)){
printf("check error: %s\n", strerror(errno));
return -2;
}
if(access(full_filename, W_OK)){
printf("check error: %s\n", strerror(errno));
return -3;
}
/*if(access(full_filename, X_OK)){
printf("check error: %s\n", strerror(errno));
return -4;
}*/
return 0;
}
int main(int argc, char *argv[])
{
char dir[256]={0};
char filename[256]={0};
if(argc < 3){
printf("Usage: ./<exec_file> <dir> <filename>\n");
return -1;
}
strncpy(dir, argv[1], sizeof(dir));
strncpy(filename, argv[2], sizeof(filename));
int status = file_check(dir, filename);
if(!status){
printf("file check success.\n");
}else{
printf("file check error! status=%d\n", status);
}
return 0;
}
編譯命令:gcc access_demo.c -o access -std=c99
運行結果1:./access ../glib_work glib_version.c
full_filename = ../glib_work/glib_version.c
file check success.
運行結果2:./access ../glib_work glib_versio
full_filename = ../glib_work/glib_versio
check error: No such file or directory
file check error! status=-1
參考