stat结构体
文件属性操作函数
文件属性查看
- node 索引节点编号:544365
- 文件类型 :文件类型是’-’,表示这是一个普通文件
- 文件权限:rw-r–r-- 表示文件可读、可写、可执行,文件所归属的用户组可读可执行,其他用户可读可执行
- 硬链接个数:表示a.txt这个文件没有其他的硬链接,因为连接数是1,就是他本身
- 文件属主:表示这个文件所属的用户,这里的意思是a.txt文件被root用户拥有,是第一个root
- 文件属组:表示这个文件所属的用户组,这里表示a.txt文件属于root用户组,是第二个root
- 文件大小:文件大小是3个字节
- 文件修改时间:这里的时间是该文件最后被更新(包括文件创建、内容更新、文件名更新等)的时间可用如下命令查看文件的修改、访问、创建时间
/******************************************************
* Descrition:通过lstat获取文件状态,并通过宏判断文件类型
******************************************************/
void exmaple1(int argc, char* argv[])
{
if (argc < 2) {
fprintf(stderr, "usage: %s files\n", argv[0]);
exit(-1);
}
int i;
struct stat buff;
for (i = 1; i < argc; i++) {
memset(&buff, 0, sizeof(buff));
if (lstat(argv[i], &buff) < 0) {
perror("lstat error!");
continue;
}
printf("%-20s", argv[i]);
//判断文件类型
if (S_ISREG(buff.st_mode)) {
printf("normal file\n");
} else if (S_ISDIR(buff.st_mode)) {
printf("directoty\n");
} else if (S_ISBLK(buff.st_mode)) {
printf("block device!\n");
} else if (S_ISCHR(buff.st_mode)) {
printf("character device\n");
} else if (S_ISSOCK(buff.st_mode)) {
printf("socket device!\n");
} else if (S_ISFIFO(buff.st_mode)) {
printf("named pipe\n");
} else if (S_ISLNK(buff.st_mode)) {
printf("link file\n");
}
}
}
文件权限
//设置文件权限
int fd=open("tmp.txt",O_WRONLY|OCREAT,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
//也可以通过八进制设置
int fd=open("tmp.txt",O_WRONLY|OCREAT,0644);
0644:
6:文件拥有者 转换成二进制 0 1(r) 1(w) 0(x),代表文件拥有者的权限是可读可写
4:同组人 转换二进制 0 1(r) 0(w) 0(x),代表同组人权限是只读的
4:其他人 转换二进制 0 1(r) 0(w) 0(x),代表其他人权限是只读的
access函数
/***********************************************************
*Description:通过access函数判断文件操作权限
* **********************************************************/
void example2(int argc, char* argv[])
{
if (argc < 2) {
fprintf(stderr, "usage: %s files\n", argv[0]);
exit(-1);
}
for (int i = 1; i < argc; i++) {
if (access(argv[i], F_OK)) {
printf("%s is not exist\n", argv[i]);
}
if (access(argv[i], R_OK)) {
printf("%d can not read %s\n", getpid(), argv[i]);
} else {
printf("%d can read %s\n", getpid(), argv[i]);
}
if (access(argv[i], W_OK)) {
printf("%d can not write %s\n", getpid(), argv[i]);
} else {
printf("%d can write %s\n", getpid(), argv[i]);
}
if (access(argv[i], X_OK)) {
printf("%d can not excute %s\n", getpid(), argv[i]);
} else {
printf("%d can excute %s\n", getpid(), argv[i]);
}
}
}
软链接和硬链接
-
硬链接
-
删除链接和文件更名
-
软链接
-
命令行实现软连接和硬链接
软链接:ln -s 源文件 目标文件 硬链接:ln 源文件 目标文件
硬链接相当于复制了一份源文件
软链接相当于创建了一个快捷方式,当源文件被删除,软链接文件也失效
-
硬链接示例
/*********************************************************** * Description:创建硬链接 ***********************************************************/ void example3(int argc, char* argv[]) { if (argc < 2) { fprintf(stderr, "usage: %s files\n", argv[0]); exit(-1); } for (int i = 2; i < argc; i++) { if (link(argv[1], argv[i]) < 0) { perror("link error!"); continue; } } printf("create success!\n"); }
-
软链接示例
/***********************************************************
* Description:创建软链接,并通过文件readlink读取文件本身内容
***********************************************************/
void example4(int argc, char* argv[])
{
if (argc < 3) {
fprintf(stderr, "usage: %s srcfile linkfiles\n", argv[0]);
exit(-1);
}
if (symlink(argv[1], argv[2]) < 0) {
perror("symlink error!\n");
}
char buffer[1024];
ssize_t size;
memset(buffer, 0, sizeof(buffer));
int fd = open(argv[2], O_RDONLY);
if (fd < 0) {
perror("open error!\n");
exit(-1);
}
//读取软链接文件引用的源文件内容
if ((size = read(fd, buffer, sizeof(buffer))) < 0) {
perror("read error!\n");
} else {
write(STDOUT_FILENO, buffer, size);
}
printf("\n");
//读取软链接文件本身的内容
memset(buffer, 0, sizeof(buffer));
if ((size = readlink(argv[2], buffer, sizeof(buffer))) < 0) {
perror("readlink error!");
} else {
write(STDOUT_FILENO, buffer, size);
}
printf("\n");
}
- 文中所涉及的例程,完整工程皆上传至下面链接中,需要自取
https://upload.csdn.net/creation/uploadResources/85176745