1. 程式人生 > >Linux下檔案屬性的獲取

Linux下檔案屬性的獲取

1. 資料結構和系統呼叫


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

標頭檔案“#include <sys/stat.h>”

(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 {
        mode_t     st_mode;       //檔案對應的模式,檔案,目錄等
        ino_t      st_ino;        //inode節點號
        dev_t      st_dev;        //裝置號碼
        dev_t      st_rdev;       //特殊裝置號碼
        nlink_t    st_nlink;      //檔案的連線數
        uid_t      st_uid;        //檔案所有者
        gid_t      st_gid;        //檔案所有者對應的組
        off_t      st_size;       //普通檔案,對應的檔案位元組數
        time_t     st_atime;      //檔案最後被訪問的時間
        time_t     st_mtime;      //檔案內容最後被修改的時間
        time_t     st_ctime;      //檔案狀態改變時間
        blksize_t st_blksize;     //檔案內容對應的塊大小
        blkcnt_t   st_blocks;     //偉建內容對應的塊數量
      };

2. 示例程式

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


(2) 寫測試程式碼

#include <sys/stat.h>
#include <fcntl.h>
#include "stdio.h"
#include "time.h"
#include "unistd.h"

void report(struct stat *ptr)
{
    if(!ptr)
    {
        return;
    }
        
    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] = {0};
    char mBuffer[64] = {0};
    char cBuffer[64] = {0};
    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)
{
	if(!pFileName)
	{
		printf("error: file pointer is null in Test function\n");
		return;
	}
	printf("File %s is be in testing ...\n", pFileName);

	struct stat st;
	int nRev_st = stat(pFileName, &st);
	if(nRev_st < 0)
	{
		printf("File %s is not existed \n", pFileName);
	}
	else
	{
		printf("------get file %s info by stat \n", pFileName);
		report(&st);
	}

	struct stat ls;
	int nRev_ls = lstat(pFileName, &ls);
	if(nRev_ls < 0)
	{
		printf("File %s is not existed \n", pFileName);
	}
	else
	{
		printf("------get file %s info by lstat \n", pFileName);
		report(&ls);
	}

	struct stat fs;
	int fd = open(pFileName, O_RDONLY);
	int nRev_fs = fstat(fd, &fs);
	close(fd);
	if(nRev_fs < 0)
	{
		printf("File %s is not existed \n", pFileName);
	}
	else
	{
		printf("------get file %s info by fstat \n", pFileName);
		report(&fs);
	}
}

int main()
{
	const char* pFileName_Real = "test.txt";
	const char* pFileName_Link = "link";
	Test(pFileName_Real);
	printf("\n\n");
	Test(pFileName_Link);
	return 0;
}
(3) 執行結果







相關推薦

Linux檔案屬性獲取

1. 資料結構和系統呼叫 在Linux下進行C/C++程式設計,主要通過以下三個系統呼叫來獲取檔案(普通檔案,目錄,管道,socket,字元,塊等)屬性。 標頭檔案“#include <sys/stat.h>” (1) //通過檔名稱獲取檔案屬性 int sta

Linux,grep獲取檔案中的最後一次匹配項

如題:使用grep獲取檔案中的最後一次匹配項 grep '查詢的內容' -A 100 檔名 | tail -n 101 grep獲取檔案中的最後一次匹配項,以及後面100行, 注意是tail -n 101而不是tail -n 100,因為tail -n 100將不會顯示匹配內

Linux 檔案完全複製(屬性不變)

在linux中怎樣用命令完全拷貝一個目錄下的所有檔案(包括隱藏檔案以及資料夾)到另外一個目錄下,並且使得被複制的所有檔案的屬性等完全保持不變? 注意,連原來的資料夾中所有的檔案的屬性、連結等都不能更改。也就是說,要建立原來資料夾的一份一模一樣的拷貝!&n在linux

LinuxC語言獲取目錄中的檔案列表

struct stat info; stat(path,&info); if(S_ISDIR(info.st_mode))     printf("This is a directory");  stat結構及其域如下所示:           struct stat {              

linux stat statfs 獲取 檔案 磁碟 資訊

stat函式講解 表頭檔案:    #include <sys/stat.h>              #include <unistd.h>定義函式:    int stat(const char *file_name, struct stat *buf); 函式說明:    通過

Linux用C獲取當前時間

time() 使用 ble timespec -1 ber 區間 本地 指向 Linux下用C獲取當前時間,具體如下: 代碼(可以把clock_gettime換成time(NULL)) ? 1 2 3 4 5 6 7 8 9 10 void getN

linuxc語言獲取當前時間

keyword spa pre urn markdown view 技術分享 時間 tle 和時間有關的函數定義在頭文件”time.h”中 常用函數: time_t time(time_t *t); 函數說明:此函數會返回從公元 1970 年1 月1 日的UTC

linux檔案的建立時間、訪問時間、修改時間和改變時間

   Linux系統中沒有命令可以確切的檢視一個檔案的生成時間,但是可以知道訪問時間,修改時間,改變時間。 可以通過stat命令檢視一個檔案的訪問時間,修改時間,改變時間: 以下為三個時間的區別: 1、訪問時間(accesstime):讀取一次檔案的內容,該時間

LinuxC語言獲取本機IP地址

#include <sys/ioctl.h> #include <net/if.h> #include <arpa/inet.h>   char* GetLocalIp() { int MA

Linux使用java獲取cpu、記憶體使用率

原文地址:http://www.voidcn.com/article/p-yehrvmep-uo.html 思路如下:Linux系統中可以用top命令檢視程序使用CPU和記憶體情況,通過Runtime類的exec()方法執行命令"top”,獲取"top"的輸出,從而得到CPU和記憶體的使用情況。

Linux管理員許可權獲取(su和sudo的區別)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Linux修改檔案屬性以及許可權

原文連結:Linux修改檔案屬性以及許可權 chgrp:改變檔案所屬使用者組 chown:改變檔案所有者 chmod改變檔案的許可權 下圖我是新建了一個text.txt文件,然後ls顯示。看到了這個檔案所有者以及檔案所屬使用者組都是somnus,然後修改檔案所屬使用

Linux檔案解壓縮、軟體安裝

1、linux常用解壓縮命令:.zip格式  解壓:unzip  檔名.zip   壓縮:zip  檔名.zip  目錄名 .tar格式  壓縮:tar  cvf  檔名.tar  檔名

linux檔案的大小到底多大

檔案的大小和實際佔用的空間,是倆回事兒,一般情況下,檔案大小 < 其佔用空間的大小, 即 ls -al file_name 小於 du -sk file_name 的大小 ,原因是:佔用空間取決於檔案系統的塊(block)的大小,linux一般預設是4k(4096) ,因此,一個大小為1個位元組的檔案,

linux檔案比較工具diff|cmp使用小結

轉自:http://blog.csdn.net/wangjianno2/article/details/50451737,記錄下便於忘記時查詢。 1.diff diff是Unix系統的一個很重要的工具程式。它用來比較兩個文字檔案的差異,是程式碼版本管理的基石之一。 2.diff使用

linux 檔案同步函式(fflush、sync、fsync、fdatasync)之間差異

遇到機器異常關機時,寫log檔案資訊丟失問題,所以記錄下。   Linux實現中在核心設有緩衝區快取記憶體或頁面快取記憶體,大多數磁碟I/O都通過緩衝區進行。當我們向檔案寫資料時,核心通常先將資料複製到一個緩衝區中,如果該緩衝區尚未寫滿,則並不將其排入輸出佇列,而是等待寫滿或者核心需要重用該

Linux檔案編碼格式轉換

常常在Linux中操作Windows下的檔案時,會遇到亂碼的情形。常見的比如在Visual Studio 中寫的C\C++程式需要放到Linux主機上編譯,而程式的中文註釋則顯示為亂碼,比較嚴重的是由於編碼原因,Linux上的編譯器報錯。 這是由於Windows中預設的檔案格式是GBK(gb2312),而L

解決linuxjava程式碼獲取不到本機ip地址

        今天在部署完預生產環境的時候發現一個問題,在linux下面java程式碼獲取本機ip地址獲取不到。但是我在測試環境上面是能夠獲取到的。先粘下獲取本機ip的程式碼: try{ Enumeration<NetworkInter

Linux檔案和目錄操作命令大全

1、檢視目錄內容 ls 列表顯示目錄內容 萬用字元?單字元 含其一或段[a,b,c-d] *任意 ls -l長格式顯示檔案或目錄資訊 ls -a顯示所有包括隱藏的檔案或目錄 ls -h以K、M、G單位顯示檔案或目錄資訊 ls -d顯示目錄本身屬性資訊 2、建立目錄

linux檔案在系統中的傳輸

1.scp scp file [email protected]:dir ##上傳(dir為絕對路徑) scp [email protected]:file dir ##下載(file為絕對路徑) 2.rs