文件時間與系統時間

每個文件是有三個時間的,分別是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
 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章