每個文件是有三個時間的,分別是st_atime,st_mtime和st_ctime。
st_atime: 最後一次訪問時間,如果使用read函數讀某個文件,會改變文件的這個時間
st_mtime:最後一次修改時間,如果使用write函數寫某個文件,會改變文件的這個時間
st_ctime:最後一次修改文件權限時間,如果使用chmod修改了文件的權限,會改變這個時間
怎樣獲取這三個時間呢?
使用stat族函數,man 2 stat可以查看這一族函數,有stat,fstat,lstat
int stat(const char *path, struct stat *buf);
int fstat(int fd, struct stat *buf);
int lstat(const char *path, struct stat *buf);
從函數原型可知,stat函數第一個參數需要一個地址,第二個參數需要一個結構體指針,
下面我們寫個程序來獲取當前文件的mtime, 同時獲取當前的系統時間.
int main(void)
{
struct stat stbuf; //這個結構體可以man 2 stat的手冊中看到,有詳細成員列表
struct tm filetime; //這個是存放時間的結構體,用來存放文件的時間,man localtime可以
//看到該結構體裏的詳細內容
struct tm nowtime; //存放當前系統時間
time_t now; //time_t其實是長整型,用來存放時間
int fd; //文件描述符
//stat("./test", &stbuf); //可以使用這種方式將文件信息存放到stbuf中
fd = open("./test", O_RDONLY); //也可以用這種間接的方式
if(fd < 0)
{
perror("open");
return -1;
}
fstat(fd, &stbuf);
localtime_r(&stbuf.st_mtime, &filetime);//使用localtime_r函數將文件的mtime存放到filetime中
time(&now); //獲取當前系統時間
localtime_r(&now, &nowtime); //將系統時間存放到nowtime中
printf("file tm_min is [%d] tm_sec is [%d]\n", filetime.tm_min, filetime.tm_sec, filetime);
printf("now tm_min is [%d] tm_sec is [%d]\n", nowtime.tm_min, nowtime.tm_sec, nowtime);
return 0;
}
其中的localtime_r是將time_t的時間轉化爲tm結構體的時間,更方便我們閱讀,且存儲在我們要求的地址中
還有另一個函數localtime,功能是一樣的,但是它只有一個參數,它會自動分配一個空間存放轉化爲tm結構體的時間
這樣就會遇到一個問題,如果要使用兩次或以上localtime,只能保存最後一個調用函數時轉化的時間!
另外stat可以獲取大量有關文件的信息,可以自行查閱manpage