1. 程式人生 > >stat---strftime這兩個函式

stat---strftime這兩個函式

前面講了statfs函式和opendir函式,但是要獲取某個檔案的大小和建立時間呢?statfs函式和opendir函式不能辦到。

我們想到了ls -l 命令,那麼對應的linux函式是什麼?就是stat函數了。

表頭檔案:    #include <sys/stat.h>
函式定義:    int stat(const char *file_name, struct stat *buf);
函式說明:    通過檔名filename獲取檔案資訊,並儲存在buf所指的結構體stat中
返回值:     執行成功則返回0,失敗返回-1,錯誤程式碼存於errno(需要include <errno.h>)

stat結構體定義:

struct stat {
    dev_t         st_dev;       //檔案的裝置編號
    ino_t         st_ino;         //節點
    mode_t        st_mode;   //檔案的型別和存取的許可權
    nlink_t       st_nlink;      //連到該檔案的硬連線數目,剛建立的檔案值為1
    uid_t         st_uid;        //使用者ID
    gid_t         st_gid;        //組ID
    dev_t         st_rdev;     //(裝置型別)若此檔案為裝置檔案,則為其裝置編號
    off_t         st_size;       //檔案位元組數(檔案大小)
    unsigned long st_blksize;   //塊大小(檔案系統的I/O 緩衝區大小)
    unsigned long st_blocks;   //塊數
    time_t        st_atime;      //最後一次訪問時間
    time_t        st_mtime;     //最後一次修改時間
    time_t        st_ctime;     //最後一次改變時間(指屬性)
};
那麼現在可以上程式碼了:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

#include <time.h>
int main()
{
        char *filename="/media/test/opendir.c";
		 

        struct stat info;
		struct  tm  *tmtest = NULL; 
		char  timestrcur[40]; 
		
        memset(&info, 0, sizeof(struct stat));
        stat(filename, &info);
		
        printf("size: %ld\n\n", (long int)info.st_size);//檔案大小
		
		printf("time_t:%lu\n",info.st_mtime);//列印time_t格式時間,單位是s,從1970年算起
		
		printf("ctime: %s",ctime(&info.st_mtime));//列印ctime,將時間轉換成字串
		
		tmtest = localtime(&info.st_mtime); 		
		printf("asctime: %s", asctime(tmtest));//列印asctime格式時間
		
		strftime(timestrcur,sizeof(timestrcur),"%Y-%m-%d %H-%M-%S",tmtest); 		
		printf("time: %s\n", timestrcur);//列印要求格式的時間
		
		
        return 0;
}
列印結果:
size: 1907

time_t:1411973541
ctime: Mon Sep 29 14:52:21 2014
asctime: Mon Sep 29 14:52:21 2014
time: 2014-09-29 14-52-21

關於時間處理部分有必要說明一下。

首先是stat函式得到的時間,是time_t型別,time_t實際上是長整型,到未來的某一天,從一個時間點(一般是1970年1月1日0時0分0秒)到那時的秒數(即日曆時間),它所表示的時間不能晚於2038年1月18日19時14分07秒。

此外,time.h還提供了兩種不同的函式將日曆時間(一個用time_t表示的整數)轉換為我們平時看到的把年月日時分秒分開顯示的時間格式tm:

struct tm * gmtime(const time_t *timer);                                         
struct tm * localtime(const time_t * timer);

只關注localtime這個函式

函式原型: struct tm *localtime(const time_t *timer)函式功能: 返回一個以tm結構表達的機器時間資訊函式返回: 以tm結構表達的時間,結構tm定義如下:
struct tm{
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
};
再來說說strftime()函式

我們可以使用strftime()函式將時間格式化為我們想要的格式。它的原型如下: 

size_t strftime(  
     char *strDest,  
     size_t maxsize,  
     const char *format,  
     const struct tm *timeptr  
);
我們可以根據format指向字串中格式命令把timeptr中儲存的時間資訊放在strDest指向的字串中,最多向strDest中存放maxsize個字元。該函式返回向strDest指向的字串中放置的字元數。  
函式strftime()的操作有些類似於sprintf():識別以百分號(%)開始的格式命令集合,格式化輸出結果放在一個字串中。格式化命令說明串 strDest中各種日期和時間資訊的確切表示方法。格式串中的其他字元原樣放進串中。格式命令列在下面,它們是區分大小寫的。
%a 星期幾的簡寫  
%A 星期幾的全稱  
%b 月分的簡寫  
%B 月份的全稱  
%c 標準的日期的時間串  
%C 年份的後兩位數字  
%d 十進位制表示的每月的第幾天  
%D 月/天/年  
%e 在兩字元域中,十進位制表示的每月的第幾天  
%F 年-月-日  
%g 年份的後兩位數字,使用基於周的年  
%G 年分,使用基於周的年  
%h 簡寫的月份名  
%H 24小時制的小時  
%I 12小時制的小時  
%j 十進位制表示的每年的第幾天  
%m 十進位制表示的月份  
%M 十時製表示的分鐘數  
%n 新行符  
%p 本地的AM或PM的等價顯示  
%r 12小時的時間  
%R 顯示小時和分鐘:hh:mm  
%S 十進位制的秒數  
%t 水平製表符  
%T 顯示時分秒:hh:mm:ss  
%u 每週的第幾天,星期一為第一天 (值從0到6,星期一為0)  
%U 第年的第幾周,把星期日做為第一天(值從0到53)  
%V 每年的第幾周,使用基於周的年  
%w 十進位制表示的星期幾(值從0到6,星期天為0)  
%W 每年的第幾周,把星期一做為第一天(值從0到53)  
%x 標準的日期串  
%X 標準的時間串  
%y 不帶世紀的十進位制年份(值從0到99)  
%Y 帶世紀部分的十制年份  
%z,%Z 時區名稱,如果不能得到時區名稱則返回空字元。  
%% 百分號 
另外就是ctime和asctime了
ctime:功能是 把日期和時間轉換為字串,而ctime類的物件表示的時間是基於格林威治標準時間(GMT)的。

用 法: char *ctime(const time_t *time);

asctime:是把時間換成ascii碼

用 法: char *asctime(const struct tm *tblock);

關於時間的函式太多了,整理不完了,例如還有time﹑localtime﹑mktime﹑asctime﹑ctime﹑difftime﹑alarm和setitimer,可參考:http://blog.chinaunix.net/uid-20564848-id-73411.html