Linux下的文件有着不同的分类和不同的属性,在操作过程中可以使用对应的函数获取文件的属性信息:
第一个函数:stat
函数头文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
函数的格式:
int stat(const char *pathname, struct stat *buf);
int fstat(int fd, struct stat *buf);
这里格式有两种,fstat和stat;但是fstat需要打开文件通过文件描述符获取文件属性;
函数的参数:
const char *pathname:需要获取文件属性的文件对应的路径名
struct stat *buf:一个stat函数的结构体指针
根据参数信息可知使用时需要定义一个stat结构体来保存,获取到文件信息。对应的结构体中元素如下:
struct stat {
dev_t st_dev; /*文件所在设备号或者说硬盘号 */
ino_t st_ino; /* 节点号*/
mode_t st_mode; /* 文件的权限 */
nlink_t st_nlink; /* 硬件连接数 */
uid_t st_uid; /* 用户id */
gid_t st_gid; /* 用户组id */
dev_t st_rdev; /* 针对设备文件的设备号 */
off_t st_size; /* 文件大小 */
blksize_t st_blksize; /* 系统块大小*/
blkcnt_t st_blocks; /* 文件所占块数*/
struct timespec st_atim; /* 最近存取时间 */
struct timespec st_mtim; /* 最后修改时间 */
struct timespec st_ctim; /* 指的时文件状态信息的上次修改时间 */
#define st_atime st_atim.tv_sec /* 向后兼容 */
#define st_mtime st_mtim.tv_sec
#define st_ctime st_ctim.tv_sec
};
这里边需要注意的参数有:
三个时间都是time_t 类型的,我们可以使用时间函数来转换成我们所需要的格式;
文件的权限分为以下几类:
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 (s3e) 是否为先进先出
26、S_ISSOCK (st_mode) 是否为socket 若一目录具有sticky 位 (S_ISVTX),
则表示在此目录下的文件只能被该文件所有者、此目录所有者或root 来删除或改名.
关于文件的权限值的识别方法:如图可以看出mod的值是一个整形的数,将这个整形的数转化为2进制的结果是:
mod二进制的值:1000 0001 1111 0110
1.c文件对应的权限:rwxrw-rw-
二进制的后九位分别对应了一个位置的权限值
我们可以用mod的值于&上1左移对应的位数来判断该位置是否为1,
如果为1,就代表该文件有对应的权限;
对应的类型是:“-”(普通文件)
判断文件类型的方式是mod直接与设定的掩码进行&操作,
结果和设置宏定义的进行比较就能得出对应的文件类型
当然我们也可用以下函数来判断文件是否有某种权限;
2,access函数
函数头文件
#include <unistd.h>
函数格式:
int access(const char * pathname, int mode);
函数参数:
1,const char *pathname:文件名字
2,int mod:可以填下列各种格式
R_OK, W_OK, X_OK和F_OK.
R_OK, W_OK 与X_OK 用来检查文件是否具有读娶写入和执行的权限。
2、F_OK 则是用来判断该文件是否存在。
由于access()只作权限的核查, 并不理会文件形态或文件内容,
因此,如果一目录表示为"可写入",表示可以在该目录中建立新文件等操作,
而非意味此目录可以被当做文件处理。
例如:你会发现DOS 的文件都具有"可执行"权限,但用execve()执行时则会失败。
函数返回值:
返回值:若所有欲查核的权限都通过了检查则返回0 值,表示成功,只要有一权限被禁止则返回-1。