1读取文件属性
1.1读取文件属性函数
Stat 函数
Int stat(const char * _estrict_file,struct stat*_restrict_buf)
第一个参数为欲读取状态的文件(路径字符串),可以使用绝对路径或相对路径(相对路径是相当于当前的工作目录)
第二个参数为文件属性临时存放位置,其类型为struct stat
如果成功将在第二个参数中存储该文件的基本信息,并返回0,否则返回-1,并设置errno全局变量
如果stat函数的第1个参数为符号链接文件,次读取的属性为源文件的属性,因此,要获取链接文件自身的属性,则需要调用lstat函数
Lstat函数
Int lstat(_const char *_restrict_file,struct stat *_restrict_buf)
Strcuct stat 结构体原型
struct stat {
mode_t st_mode; //文件类型及权限
ino_t st_ino; //inode值
dev_t st_rdev; //设备号
nlink_t st_nlink; //硬链接设备数
uid_t st_uid; //用户ID
gid_t st_gid; //用户组ID
off_t st_size; //文件大小
time_t st_atime; //最后一次访问时间
time_t st_mtime; //最后一次修改时间
time_t st_ctime; //最后一次改变属性时间
long st_blksize; //数据块大小
long st_blocks; //数据块数量
};
1.2文件类型宏操作
S_ISREG(mode) 普通文件
S_ISDIR(mode) 目录文件
S_ISCHAR(mode) 字符文件
S_ISBLK() 块文件
S_ISFIFO() fifo
S_ISLNK() 符号链接
S_ISSOCK() socket文件
如果要测试打开的文件是哪种类型,则可以使用isfdtype()函数
Int isfdtype(int _fd,int _fdtype)
第一个参数为文件描述符,
第二个参数为所对应的的文件类型
1.3文件类型的宏定义如下:
#define S_IFSOCK 0140000 //socket文件
#define S_IFLINK 0120000 //链接文件
#define S_IFREG 0100000 //普通文件
#define S_IFBLK 0060000 //块文件
#define S_IFDIR 0040000 //目录文件
#define S_IFCHR 0020000 //字符文件
#define S_IFIFO 0010000 fifo文件
调用isfdtype()函数实例
#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/stat.h>
int main(int argc,char *argv[])
{
int fd=-1;
fd=open(argv[1],O_RDONLY); //以只读方式打开文件
if(fd==-1)
{
perror("open");
return -1;
}
if(isfdtype (fd,S_IFREG)==1) // 判断是否为普通文件
{
printf("%s:regular file\n",argv[1]);
}
close(fd);
return 0;
}
2修改文件权限
2.1修改文件权限位函数
Chmod()函数
在shell层面上,用户可以使用chmod命令来修改某个文件的权限,在应用编程中,如果要对文件的权限位进行修改,可以使用chmod()函数来实现。
Int Chmod(_const char *file,mode_t mode);
第一个参数 const char * file 为要修改权限的文件名,
第二个参数为修改的权限描述符,mode_t 原型是unsigned int。
如果执行成功,返回0,否则返回-1 并设置errno全局变量;
如果是符号链接文件,chmod修改的是源文件权限,如果要修改其本身的权限,可使用lchmod函数
Int lchmod(const char *file,unsigned int mode);
对于已打开的文件,可以使用fchmod()函数
Int fchmod(int fd,unsigned int mode);
第一个为已打开的文件的文件描述符,
如果成功返回0 否则返回-1;
2.2文件访问权限位
在linux系统的/usr/include/sys/stat.h
在文件权限位的表示为
#define S_IRUSR _S_IREAD