Linux下檔案屬性的獲取

2021-06-05 09:47:15 字數 3028 閱讀 2946

1. 資料結構和系統呼叫

在linux下進行c/c++程式設計,主要通過以下三個系統呼叫來獲取檔案(普通檔案,目錄,管道,socket,字元,塊等)屬性。

標頭檔案「#include 」

(1) //通過檔名稱獲取檔案屬性

int stat(const char *restrict pathname, struct stat *restrict buf); 

(2) //通過檔案描述符獲取檔案屬性

int fstat(int filedes, struct stat *buf); 

(3) //通過符號檔名稱獲取檔案屬性

int lstat(const char *restrict pathname, struct stat *restrict buf);

返回值(三個函式一樣)

成功:0

失敗:-1

三個系統呼叫的區別:

1. fstat接受的第乙個引數是「檔案描述符」,stat和lstat是「檔案全路徑」,檔案描述符需要用呼叫open之後才能得到,檔案全路經直接寫即可;

2. lstat獲取的是該符號鏈結本身的資訊;而stat獲取的是該鏈結指向的檔案的資訊;

這三個系統呼叫都依賴乙個重要的結構體struct stat

struct stat ;
2. 示例程式

(1) 先在測試目錄下建立乙個test.txt檔案,然後"ln -s test.txt link"建立乙個符號檔案指向test.txt;

(2) 寫測試**

#include #include #include "stdio.h"

#include "time.h"

#include "unistd.h"

void report(struct stat *ptr)

printf("the device no is: %d\n", ptr->st_dev);

printf("the file's node number is: %d\n", ptr->st_ino);

printf("the file's access mode is: %d\n", ptr->st_mode);

printf("the file's hard link number is: %d\n", ptr->st_nlink);

printf("the file's user id is: %d\n", ptr->st_uid);

printf("the file's group id is: %d\n", ptr->st_gid);

printf("the file's size is: %d\n", ptr->st_size);

printf("the block size is: %d\n", ptr->st_blksize);

printf("the number of allocated blocks is: %d\n", ptr->st_blocks);

struct tm* paccesstime=localtime(&(ptr->st_atime));

struct tm* pmodifytime=localtime(&(ptr->st_mtime));

struct tm* pchangetime=localtime(&(ptr->st_ctime));

char abuffer[64] = ;

char mbuffer[64] = ;

char cbuffer[64] = ;

strftime(abuffer, 64, "the last access time is: %y-%m-%d %h:%m:%s \n", paccesstime);

strftime(mbuffer, 64, "the last modify time is: %y-%m-%d %h:%m:%s \n", pmodifytime);

strftime(cbuffer, 64, "the last change time is: %y-%m-%d %h:%m:%s \n", pchangetime);

printf(abuffer);

printf(mbuffer);

printf(cbuffer);

}void test(const char* pfilename)

printf("file %s is be in testing ...\n", pfilename);

struct stat st;

int nrev_st = stat(pfilename, &st);

if(nrev_st < 0)

else

struct stat ls;

int nrev_ls = lstat(pfilename, &ls);

if(nrev_ls < 0)

else

struct stat fs;

int fd = open(pfilename, o_rdonly);

int nrev_fs = fstat(fd, &fs);

close(fd);

if(nrev_fs < 0)

else }

int main()

(3) 執行結果

Linux下檔案屬性詳解

root localhost ls l總計 160 rw r r 2 root root 762 07 29 18 19 aexit rw r r 2 root root 762 07 29 18 19 exit 此時exit 和aexit稱為互為硬鏈結。同指向乙個檔案,無論是修改哪乙個檔案,另乙個...

Qt獲取檔案屬性

在qt中有qfileinfo類專門提供了獲取檔案資訊的各種介面,比如檔名稱,位置資訊,檔案的許可權,目錄,檔案或符號連線,檔案大小,建立時間,最後修改時等等,下面通過 來看一些具體的屬性獲取。ifndef mainwindow h define mainwindow h include qt beg...

獲取檔案屬性函式

表頭檔案 include 函式定義 int stat const char file name,struct stat buf 函式說明 通過檔名filename獲取檔案資訊,並儲存在buf所指的結構體stat中 返回值 執行成功則返回0,失敗返回 1,錯誤 存於errno 需要include er...