Linux文件属性2——使用stat函数获取文件属性
生活随笔
收集整理的這篇文章主要介紹了
Linux文件属性2——使用stat函数获取文件属性
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
以下內容源于朱有鵬《物聯網大講堂》課程的學習整理,如有侵權,請告知刪除。
一、獲取文件屬性
1、stat、fstat、lstat函數簡介
- 每個文件都附帶有一些屬性;
- 屬性信息存在于文件本身中,只能被專用的API打開看到;
- API有stat、fstat、lstat三個,作用一樣,參數不同,細節略有不同。
(1)linux命令行下,用stat命令查看文件屬性信息
- 如stat a.out;
- 用man 1 stat,man 2 stat查看,發現stat命令內部就是使用stat系統調用來實現的;
(2)stat的作用
- 內核將某個文件的屬性信息結構體填充到stat函數的buf中;(參數里面,有指針,而且不加const,說明是輸出型參數)
- 當stat這個API調用從內核返回時,buf這個結構體就被文件的屬性信息填充好了;
- 通過查看buff結構體變量的元素,就可以得知該文件的各種屬性。
(3)fstat和stat的區別
- stat是從文件名出發得到文件屬性信息結構體,而fstat是從一個已經打開的文件fd出發,得到一個文件的屬性信息;
- 如果文件沒有打開就用stat,如果文件已經被打開用fstat效率會更高(stat是從磁盤去讀取文件的,而fstat是從內存讀取動態文件的);
(4)lstat和stat/fstat的差別
- 對于符號鏈接文件,stat和fstat查閱的是符號鏈接文件指向的文件的屬性,而lstat查閱的是符號鏈接文件本身的屬性。
2、struct stat結構體簡介
- struct stat是內核定義的一個結構體,在<sys/stat.h>中聲明,見上圖;
- 這個結構體中的所有元素加起來就是文件屬性信息;
3、代碼實戰
- 寫代碼查看一些常見屬性信息,和直接用stat命令對比
二、stat函數的應用案例
1、用代碼判斷文件類型
(1)文件類型就是-、d、l……
(2)文件類型標志在struct stat結構體的mode_t ? ?st_mode元素中
- unsigned int類型,每個bit位表示一個含義;
- 由很多個標志位共同構成,記錄了很多信息,如果要查找時按位&操作就知道結果了;
- 但是這些位定義不容易記住,因此linux系統事先定義很多宏來進行相應操作;
- 譬如S_ISREG宏返回值是1表示這個文件是一個普通文件,如果文件不是普通文件則返回值是0;
2、用代碼判斷文件權限設置
(1)st_mode中除了記錄文件類型,還記錄著一個重要信息:文件權限。
(2)linux并沒有給文件權限測試提供宏操作,而是只提供位掩碼,所以我們只能用位掩碼來判斷是否具有相應權限。
3、代碼展示
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <string.h> #include <stdlib.h>#define NAME "1.txt"int main(void) {int ret = -1;struct stat buf;memset(&buf, 0, sizeof(buf)); // memset后buf中全是0ret = stat(NAME, &buf); // stat后buf中有內容了if (ret < 0){perror("stat");exit(-1);}#if 0 // 判斷這個文件屬性//int result = S_ISREG(buf.st_mode);int result = S_ISDIR(buf.st_mode);printf("result = %d\n", result); #endif// 文件權限測試//unsigned int result = (buf.st_mode & S_IRWXU) >> 8;unsigned int result = ((buf.st_mode & S_IRUSR)? 1: 0);printf("file owner: %u.\n", result);return 0; }總結
以上是生活随笔為你收集整理的Linux文件属性2——使用stat函数获取文件属性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件测试工程师核心竞争力(转)
- 下一篇: 如何使用cmd查看jdk版本