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