linux文件操作-stat

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

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

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

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

命令的显示效果

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

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

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

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

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

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

这样你就可以找到它了)

 

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

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

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

接下来我们就通过一个简单的demo来使用一下 通过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;
}

效果:

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

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

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

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

来一起讨论

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值