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編程我會在下面的文章中陸續的分享,也可以關注‘奇牛學院’

來一起討論

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章