一、stat
头文件 sys/stat.h unistd.h
函数原型
结构体struct stat说明
struct stat {dev_t st_dev; //device 文件的设备编号ino_t st_ino; //inode 文件的i-nodemode_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 位
12、S_IRUSR (S_IREAD) 00400 文件所有者具可读取权限
13、S_IWUSR (S_IWRITE)00200 文件所有者具可写入权限
14、S_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 中定义了检查这些类型的宏定义
21、S_ISLNK (st_mode) 是否是一个连接
22、S_ISREG (st_mode) 是否是一个常规文件
23、S_ISDIR (st_mode) 是否是一个目录
24、S_ISCHR (st_mode) 是否是一个字符设备
25、S_ISBLK (st_mode) 是否是一个块设备
26、S_ISFIFO (st_mode) 是否是一个FIFO文件
27、S_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");
}