1. 程式人生 > >實現檔案時間資訊的列印輸出

實現檔案時間資訊的列印輸出

一、 基礎知識

在Linux中,沒有檔案建立時間的說法,只有修改時間(st_mtime)、狀態更改時間(st_ctime)、最後訪問時間(st_time)三種。值得注意的是,時間

圖1 ls -l每一列資訊的含義(以空格隔開作為一列)

ls -l列印輸出的正是修改時間,在Linux下容易驗證,在此不加贅述。

Linux中的時間是這樣紀錄的——記下距特定時間 (1970年1月1日00:00:00)(以Unix誕生的時間為參照確定的,UNIX認為1970年1月1日0點是時間紀元) 的秒數(乃至納秒),然後經過一系列轉換變成我們看到的樣子。

二、 程式碼實現

首先,在struct stat結構(#include<sys/stat.h>)中,有一欄位為st_mtime,目前精度是秒數;其次,將st_mtime交由gmtime或localtime(#include<time.h>)函式進行處理,得到struct tm(#include<time.h>)結構內容是不一樣的——前者是本機時間,後者是統一時間,簡單來理解:我不聯網就可以把電腦的時間改成我想要的,這樣,世界一個時間,我的電腦一個時間,沒有一點問題。最後,呼叫strftime(#include<time.h>)函式對tm進行處理(類似於printf函式)。

圖2 時間函式呼叫示意圖
#include<time.h>    //strftime() localtime()
#include<sys/stat.h>	//stat()
#include<assert.h>  //assert()
#include<stdio.h>   //printf()

int main()
{
    struct stat st;
    assert(0 == stat("/home/zhaopulei/桌面/a.txt", &st));    //由stat()函式自動填寫變數st。
    
    struct tm *tmp = localtime(&st.st_mtime);    //由localtime()自動返回struct tm*型別。
    assert(NULL != tmp);   
    
    char buf[64];
    assert(0 != strftime(buf, 64, "%m月 %e日 %R", tmp));    //由strftime將時間分解成字串寫入buf中。

    printf("%s\n", buf);    //列印輸出結果。
    return 0;
}

程式碼說明,在Linux桌面上新建檔案a.txt,嘗試輸出時間。

圖3 執行結果

經過比對,和ls命令輸出的結果一致,證明程式碼執行正確。本電腦虛擬機器上安裝的Linux沒有聯網,時間是自己的那一套。