Linux C

转载 2015年11月19日 19:45:33
对于判断文件是否存在,每个人有不同的方法!我通常采用两种方法 : open 和 access ;

这个俩个方法有相似之处,且有不同之处;下面为大家详细说明他们的不同之处:

open 是打开,读写等操作文件的一个函数,access就是一个判断文件权限的函数。在linux下,由于文件有不同的权限,当当前用户没有对此文件的读权限的时候,用来判断文件是否存在,显然不合适。而access却可以做到。

open 的第一个参数是文件路径,第二个参数是打开文件选项,常用的有O_RDONLY(读),O_WRONLY(写),O_RDWR(读写),O_CREAT(创建)。 第三个参数通常在创建文件的时候才使用,给文件设定权限使用。

access的第一个参数是文件路径,第二个参数是测试的模式。常用的有R_OK:测试读权限,W_OK:测试写权限,X_OK:测试执行权限,F_OK:测试文件是否存在;

我做个例子,写一个小程序来看两者的区别。
测试测序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
int main(int argc , char **argv)
{
char path[50];
memset(path,0,50);
sprintf(path,"%s","./test");
int fd;

printf("access function -------------------------/n");

if((fd = access (path,F_OK)) == 0)
printf("[access] file exist!/n");    
else    
printf("[access] file not exist!!/n");

if((fd = access (path,R_OK)) == 0)
printf("[access] read file ok!/n");
else    
printf("[access] read file no!/n");

if((fd = access (path,W_OK)) == 0)
printf("[access] write file ok!/n");
else    
printf("[access] write file no!/n");

if((fd = access (path,X_OK)) == 0)
printf("[access] execute file ok!/n");
else    
printf("[access] execute file no!/n");

printf("open  function -------------------------/n");


if((fd = open (path,O_RDONLY)) == -1)
printf("[open] open no!/n");
else    
{
close(fd);
printf("[open] open ok!/n");
}

if((fd = open (path,O_WRONLY)) == -1)
printf("[open] write no!/n");
else    
{
close(fd);
printf("[open] write ok!/n");
}
if((fd = open (path,O_RDWR)) == -1)
printf("[open] rdwr no!/n");
else    
{
close(fd);
printf("[open] rdwr ok!/n");
}
}


首先我们创建一个普通文件 test , 修改文件权限为0744,修改文件属主为root. 我们在普通用户mpeg4下操作.

[mpeg4@mc2800 file1]$ sudo chown root:root test
[mpeg4@mc2800 file1]$ sudo chmod 0744 test
[mpeg4@mc2800 file1]$ ls -l
total 20
-rwxrwxrwx 1 mpeg4 mpeg4 7157 2009-09-17 09:37 file
-rwxrwxrwx 1 mpeg4 mpeg4  991 2009-09-17 09:44 file.c
-rwxrwxrwx 1 mpeg4 mpeg4   94 2009-09-17 08:56 makefile
-rwxrwxrwx 1 mpeg4 mpeg4 3808 2009-08-20 13:52 records
-rwxr--r-- 1 root  root     0 2009-09-17 10:06 test

好了,我们运行我的程序看结果:

[mpeg4@mc2800 file1]$ ./file
access function -------------------------
[access] file exist!
[access] read file ok!
[access] write file no!
[access] execute file no!
open  function -------------------------
[open] open ok!
[open] write no!
[open] rdwr no!

很明显在用户有读权限的情况下,使用那个函数用来判断文件是否存在都可以。
现在我们把文件的权限改为0740:
sudo chmod 0740 test
再看测试结果:

[mpeg4@mc2800 file1]$ ./file
access function -------------------------
[access] file exist!
[access] read file no!
[access] write file no!
[access] execute file no!
open  function -------------------------
[open] open no!
[open] write no!
[open] rdwr no!

可以看到,文件权限改变了,就不能用open函数来判断文件是否存在了。

我相信很多人都喜欢用open函数来判断文件是否存在,当然大家也都知道关于权限的问题,所以会采用一些必要测措施来控制出错。但是我建议判断文件是否存在最好用access函数。当我们要读取文件内容的时候可以使用open来判断文件是否存在,就算是因为没有读权限或者文件真的不存在,都无法实现读的操作,我们的目的也就达到了

相关文章推荐

Linux C程序设计王者归来.2014

  • 2017年10月25日 23:19
  • 147.89MB
  • 下载

Linux C函数帮助文档

  • 2017年11月04日 20:52
  • 102KB
  • 下载

linux C/C++服务器后台开发面试题总结

一、编程语言 1.根据熟悉的语言,谈谈两种语言的区别? 主要浅谈下C/C++和PHP语言的区别: 1)PHP弱类型语言,一种脚本语言,对数据的类型不要求过多,较多的应用于Web应用开发,现在好多...

Java 解析 Linux C结构体

  • 2017年08月20日 13:31
  • 3KB
  • 下载

json库linux c

  • 2017年09月21日 16:40
  • 13KB
  • 下载

Linux c 开发 - Autotools使用详细解读

我们前面的章节中已经讲到了Makefile的使用(点击进入查看文章)。我们知道在Linux下面如果编译一个比较大型的项目,我们可以通过Makefile的方式来完成。 但是,我们又蛋疼了,Makefil...
  • initphp
  • initphp
  • 2015年02月10日 17:35
  • 4695

linux c 一站式学习

  • 2015年01月09日 02:07
  • 4.89MB
  • 下载

linux C WebServer xml解释

  • 2016年12月21日 18:59
  • 1.19MB
  • 下载

Linux C/C++ 程序员毕业工作一年多来的感想

从2015年年中毕业到现在2016年年底,不知不觉已经工作了一年半了。时间过的真快。正好年底了,总结一下这一年半来的感想。工作和在学校写代码的不同在学校写代码,很少有规模特别大的,最多也就几千行,代码...

linux c库存函数

  • 2014年09月08日 15:40
  • 36.59MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux C
举报原因:
原因补充:

(最多只允许输入30个字)