C语言判断文件是否存在之stat、fopen、access

一、stat

头文件 sys/stat.h unistd.h
函数原型

结构体struct stat说明

struct stat {
    dev_t st_dev; //device 文件的设备编号
    ino_t st_ino; //inode 文件的i-node
    mode_t st_mode; //protection 文件的类型和存取的权限
    nlink_t st_nlink; //number of hard links 连到该文件的硬连接数目, 刚建立的文件值为1.
    uid_t st_uid; //user ID of owner 文件所有者的用户识别码 
    gid_t st_gid; //group ID of owner 文件所有者的组识别码 
    dev_t st_rdev; //device type 若此文件为装置设备文件, 则为其设备编号 
    off_t st_size; //total size, in bytes 文件大小, 以字节计算 
    unsigned long st_blksize; //blocksize for filesystem I/O 文件系统的I/O 缓冲区大小. 
    u nsigned long st_blocks; //number of blocks allocated 占用文件区块的个数, 每一区块大小为512 个字节. 
    time_t st_atime; //time of lastaccess 文件最近一次被存取或被执行的时间, 一般只有在用mknod、 utime、read、write 与tructate 时改变.
    time_t st_mtime; //time of last modification 文件最后一次被修改的时间, 一般只有在用mknod、 utime 和write 时才会改变
    time_t st_ctime; //time of last change i-node 最近一次被更改的时间, 此参数会在文件所有者、组、 权限被更改时更新 
};
1、S_IFMT 0170000 文件类型的位遮罩 
2、S_IFSOCK 0140000 scoket
3、S_IFLNK 0120000 符号连接 
4、S_IFREG 0100000 一般文件 
5、S_IFBLK 0060000 区块设备 
6、S_IFDIR 0040000 目录 
7、S_IFCHR 0020000 字符设备 
8、S_IFIFO 0010000 先进先出 
9、S_ISUID 04000 文件的 (set user-id on execution)10、S_ISGID 02000 文件的 (set group-id on execution)11、S_ISVTX 01000 文件的sticky 位 
12S_IRUSR (S_IREAD) 00400 文件所有者具可读取权限 
13S_IWUSR (S_IWRITE)00200 文件所有者具可写入权限 
14S_IXUSR (S_IEXEC) 00100 文件所有者具可执行权限 
15、S_IRGRP 00040 用户组具可读取权限 
16、S_IWGRP 00020 用户组具可写入权限 
17、S_IXGRP 00010 用户组具可执行权限 
18、S_IROTH 00004 其他用户具可读取权限 
19、S_IWOTH 00002 其他用户具可写入权限 
20、S_IXOTH 00001 其他用户具可执行权限上述的文件类型在 POSIX 中定义了检查这些类型的宏定义 
21S_ISLNK (st_mode) 是否是一个连接
22S_ISREG (st_mode) 是否是一个常规文件
23S_ISDIR (st_mode) 是否是一个目录 
24S_ISCHR (st_mode) 是否是一个字符设备
25S_ISBLK (st_mode) 是否是一个块设备
26S_ISFIFO (st_mode) 是否是一个FIFO文件
27S_ISSOCK (st_mode) 是否是一个SOCKET文件 
若一目录具有sticky 位 (S_ISVTX), 则表示在此目录下的文件只能 被该文件所有者、此目录所有者或root 来删除或改名.
二、fopen

头文件 stdio.h>
函数原型

FILE *fopen(const char *filename, const char *mode);

mode说明

字符串说明
r以只读方式打开文件,该文件必须存在。
r+以读/写方式打开文件,该文件必须存在。
rb+以读/写方式打开一个二进制文件,只允许读/写数据。
rt+以读/写方式打开一个文本文件,允许读和写。
w打开只写文件,若文件存在则文件长度清为零,即该文件内容会消失;若文件不存在则创建该文件。
w+打开可读/写文件,若文件存在则文件长度清为零,即该文件内容会消失;若文件不存在则创建该文件。
a以附加的方式打开只写文件。若文件不存在,则会创建该文件;如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(EOF 符保>留)。
a+以附加方式打开可读/写的文件。若文件不存在,则会创建该文件,如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(EOF符>不保留)。
wb以只写方式打开或新建一个二进制文件,只允许写数据。
wb+以读/写方式打开或新建一个二进制文件,允许读和写。
wt+以读/写方式打开或新建一个文本文件,允许读和写。
at+以读/写方式打开一个文本文件,允许读或在文本末追加数据。
ab+以读/写方式打开一个二进制文件,允许读或在文件末追加数据。
三、access

头文件:unistd.h
函数原型

int access(const char *filenpath, int mode);

mode说明,可以加减,最高777

R_OK[4] 只判断是否有读权限
W_OK[2] 只判断是否有写权限
X_OK[1] 判断是否有执行权限
F_OK[0] 只判断是否存在
四、示例代码
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>

void isFile(char *filename, int mode);
void isOpenFile(char *filename);
void isStatFile(char *filename);
int main()
{

	printf("文件夹存在且可写\n");
	isFile("/home/work/data", F_OK);	
	isFile("/home/work/filedata", F_OK);	
	printf("文件夹存在且可写\n");
	isFile("/home/work/data/asd.txt", 7);	
	isFile("/home/work/data/qwe.txt", F_OK);	
	isOpenFile("/home/work/data/asd.txt");
	isStatFile("/home/work/data/asd.txt");
	return 0;

}
/*
R_OK[4] 只判断是否有读权限
W_OK[2] 只判断是否有写权限
X_OK[1] 判断是否有执行权限
F_OK[0] 只判断是否存在\n"
*/
void isFile(char *filename, int mode)
{
	printf("isFile start <<<<<<<<<<<<<<<<<<<<<<<<\n");
	int iRent = 0;

	iRent = access(filename, mode);
	if( 0 == iRent )
	{
		printf("file[%s]符合权限要求mode[%d][%d]\n", filename, mode, iRent);
	}
	else
	{
		printf("file[%s]不符合权限要求mode[%d][%d]\n", filename, mode, iRent);
	}
	printf("isFile end >>>>>>>>>>>>>>>>>>>>>>>>\n");

}

/*
|字符串 | 说明 |
|:--|:--|
|r      | 以只读方式打开文件,该文件必须存在。 |
|r+     | 以读/写方式打开文件,该文件必须存在。 |
|rb+    | 以读/写方式打开一个二进制文件,只允许读/写数据。 |
|rt+    | 以读/写方式打开一个文本文件,允许读和写。 |
|w      | 打开只写文件,若文件存在则文件长度清为零,即该文件内容会消失;若文件不存在则创建该文件。 |
|w+     | 打开可读/写文件,若文件存在则文件长度清为零,即该文件内容会消失;若文件不存在则创建该文件。 |
|a      | 以附加的方式打开只写文件。若文件不存在,则会创建该文件;如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(EOF 符保留)。 |
|a+     | 以附加方式打开可读/写的文件。若文件不存在,则会创建该文件,如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(EOF符不保留)。 |
|wb     | 以只写方式打开或新建一个二进制文件,只允许写数据。 |
|wb+    | 以读/写方式打开或新建一个二进制文件,允许读和写。 |
|wt+    | 以读/写方式打开或新建一个文本文件,允许读和写。 |
|at+    | 以读/写方式打开一个文本文件,允许读或在文本末追加数据。 |
|ab+    | 以读/写方式打开一个二进制文件,允许读或在文件末追加数据。 |
*/

void isOpenFile(char *filename)
{
	printf("isOpenFile start <<<<<<<<<<<<<<<<<<<<<<<<\n");
	FILE *file = NULL;
	file = fopen(filename, "r");
	if(NULL == file)
	{
		printf("文件打开失败\n");
	}
	else
	{
		printf("文件打开成功\n");
	}
	fclose(file);
	printf("isOpenFile end >>>>>>>>>>>>>>>>>>>>>>>>\n");

}



void isStatFile(char *filename)
{
	printf("isStatFile start <<<<<<<<<<<<<<<<<<<<<<<<\n");
	struct stat stfileStat;
	memset(&stfileStat, 0x00, sizeof(stfileStat));

	if(-1 == stat(filename, &stfileStat))
	{
		printf("判断失败\n");
	}
	else
	{
		printf("stat.st_size[%d]\n", stfileStat.st_size);
	
	}
	printf("isStatFile end >>>>>>>>>>>>>>>>>>>>>>>>\n");
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值