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...