欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

linux文件操作-stat

程序员文章站 2022-05-24 15:30:07
...

今天 我们重点来讲讲stat这个系统调用(因为在编写中经常用到所以重点提出来讲解)

stat也是一个命令(主要记录文件的一些基本信息)

其实stat也是一个结构体 linux操作系统为了方便,报操作这个结构体的函数 也命名为stat/lstat

首先我们先来看看这个结构体的具体成员

linux文件操作-stat

命令的显示效果

linux文件操作-stat

由于我的ubuntu安装了中文 大家可以一目了然的看见一些信息的意思。

1.这里主要讲解一下Inode号

Inode号是 每个文件系统区分不同文件的标识,通过遍历目录项得到inode号  来访问inode结点

通过目录项-》inode结点-》文件数据块(我们前面提及到的淘宝分布式存储引擎也是这种相似的原理)

2.硬链接:可以理解成就是通过文件本身来访问文件的内容(也是一种文件)

3.软链接:可以理解成通过一个第三方来间接访问这个文件的内容(就像你要找一个人找不到,但是你可以向第三人打听消息,

这样你就可以找到它了)

linux文件操作-stat

 

4.然后就是 stat结构体中的st_mode数据成员

linux文件操作-stat

我们可以通过这个成员来得到文件的权限 或者判断文件是什么类型的   只需要  位运算一下  &  看某个权限是否存在

linux文件操作-stat

linux文件操作-stat

linux文件操作-stat

也可以通过一些定义的宏来判断文件的类型

linux文件操作-stat

接下来我们就通过一个简单的demo来使用一下 通过stat是怎么得到文件的信息的

linux文件操作-stat

stat/fstat都是相同的道理  就是函数操作文件的方式不一样而已

lstat特殊一些

以上都是把文件的信息存入一个statbuf中

stat(穿透函数-软连接) 如果读取的文件就是软连接根据软连接读取指向的文件信息

lstat(非穿透函数-不追踪)如果读取的文件就是软连接就读取软连接文件的信息(由于软连接也是一种文件)

代码demo:

#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <iostream>
#include <string.h>
#include <fcntl.h>
#include <errno.h>

using namespace std;

static int Debug = 1;


int32_t
main(int32_t argc, char* argv[])
{
	int32_t fd = open("./tmp", O_RDWR | O_CREAT | O_EXCL, 0644);
	if (fd < 0) {
		fprintf(stderr, "create file error the reason is %s\n", strerror(errno));
		exit(1);
	}
	ftruncate(fd, 200);   // 扩容一下啊
	unlink("./tmp");    // 删除这个临时文件 (在进程放弃这个文件使用之后)
	int ret = 0;   
	struct stat statbuf;
	if ((ret = fstat(fd, &statbuf)) < 0) {
		fprintf(stderr, "stat file error the reason is %s\n", strerror(errno));
	}else {
		if (S_ISDIR(statbuf.st_mode)) {// 如果这个文件是一个目录
			if (Debug)printf("the file is a dir\n");
		}
		else {
			if (Debug)printf("the file is not a dir\n");
			printf("the file size : %d\n", statbuf.st_size);
		}
	}
	close(fd);
	return 0;
}

效果:

linux文件操作-stat

linux文件操作-stat

你看并没有创建的文件,因为我们已经在代码中把文件删除了 在close(fd)之后,所以以后对于临时的文件 我们就可以采用这种操作

其实还有很多的关于文件操作的linux的api, 像什么  symlink,link, readlink rename, access等等的都非常的简单

用的时候只需要插一下相关的api就可以了

更多的C/C++ linux编程我会在下面的文章中陆续的分享,也可以关注‘奇牛学院’

linux文件操作-stat

来一起讨论

 

 

 

 

 

 

 

 

相关标签: linux编程初阶