1. 程式人生 > >Linux下對檔案建立、修改、訪問時間的一些操作

Linux下對檔案建立、修改、訪問時間的一些操作

學習,stat,lstat,fstat 1 函式都是獲取檔案(普通檔案,目錄,管道,socket,字元,塊()的屬性。 函式原型 #include <sys/stat.h>

int stat(const char *restrict pathname, struct stat *restrictbuf); 提供檔名字,獲取檔案對應屬性。
int fstat(int filedes, struct stat *buf); 通過檔案描述符獲取檔案對應的屬性。
int lstat(const char *restrict pathname, struct stat *restrictbuf); 連線檔案描述命,獲取檔案屬性。 2 檔案對應的屬性 struct stat {
mode_t st_mode; //檔案對應的模式,檔案,目錄等
ino_t     st_ino;      //inode節點號
dev_t     st_dev;       //裝置號碼
dev_t     st_rdev;      //特殊裝置號碼
nlink_t   st_nlink;     //檔案的連線數
uid_t     st_uid;       //檔案所有者
gid_t     st_gid;       //檔案所有者對應的組
off_t     st_size;      //普通檔案,對應的檔案位元組數
time_t    st_atime;     //檔案最後被訪問的時間
time_t    st_mtime;     //檔案內容最後被修改的時間
time_t    st_ctime;     //檔案狀態改變時間
blksize_t st_blksize;   //檔案內容對應的塊大小
blkcnt_t  st_blocks;    //偉建內容對應的塊數量
}; 可以通過上面提供的函式,返回一個結構體,儲存著檔案的資訊。 長湖區的資訊是檔案的所有者和檔案的模式。

#include
<iostream.h>//C++ 獲得檔案狀態資訊原始碼,C++ 獲得檔案所在磁碟碟符原始碼,C++ 檔案建立時間原始碼,C++ 訪問時間原始碼,C++ 最後修改日期原始碼,No such file or directory(無此檔案或索引)
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>

void main( void )
{
    struct stat buf;
    int result;

    //獲得檔案狀態資訊
result =stat( "D:\ok2002.txt", &buf ); //顯示檔案狀態資訊 if( result != 0 ) perror( "顯示檔案狀態資訊出錯" );//並提示出錯的原因,如No such file or directory(無此檔案或索引) else { cout<<"檔案大小:"<<buf.st_size<<"位元組"<<endl; cout<<"所在磁碟碟符 :"; cout<<char
(buf.st_dev + 'A')<<endl; cout<<"檔案建立時間:"<<ctime(&buf.st_ctime); cout<<"訪問日期:"<<ctime(&buf.st_atime);//注意這裡訪問時間為00:00:00為正常 cout<<"最後修改日期:"<<ctime(&buf.st_mtime); } }

相關函式:utimes, stat
表頭檔案:#include  <sys/types.h>
#include  <utime.h>
定義函式:int  utime(const  char *filename,  struct utimbuf  *buf)
函式說明:utime()用來修改引數filename檔案所屬的inode存取時間。結構utimbuf定義如下
struct  utimbuf{
time_t  actime;  /*存取時間*/
time_t  modtime;  /*更改時間*/
};

如果引數buf為空指標(NULL), 則該檔案的存取時間和更改時間全部會設為目前時間

返回值:  成功0,  失敗-1, 錯誤程式碼存於errno
錯誤程式碼:
EACCESS                   存取檔案時被拒絕,許可權不足
ENOENT                    指定的檔案不存在



另外,用shell直接 ls -l 可以看到最後修改時間,ls-ul 可以看到最後訪問時間

在Linux中,沒有檔案建立時間的概念。只有檔案的訪問時間、修改時間、狀態改變時間。也就是說不能知道檔案的建立時間。但如果檔案建立後就沒有修改過,修改時間=建立時間;如果檔案建立後,狀態就沒有改變過,那麼狀態改變時間=建立時間;如果檔案建立後,沒有被讀取過,那麼訪問時間=建立時間,這個基本不太可能。

  與檔案相關的幾個時間:

  1、訪問時間,讀一次這個檔案的內容,這個時間就會更新。比如對這個檔案使用more命令。ls、stat命令都不會修改檔案的訪問時間。

  2、修改時間,對檔案內容修改一次,這個時間就會更新。比如:vi後儲存檔案。ls -l列出的時間就是這個時間。

  3、狀態改變時間。通過chmod命令更改一次檔案屬性,這個時間就會更新。檢視檔案的詳細的狀態、準確的修改時間等,可以通過stat命令 檔名。

  比如: [[email protected] c]$ stat temp.c

  引用:

  File: 'temp.c'

  Size: 66 Blocks: 8 IO Block: 4096 \u4e00\u822c\u6587\u4ef6

  Device: 807h/2055d Inode: 1191481 Links: 1

  Access: (0664/-rw-rw-r--) Uid: ( 500/ jing) Gid: ( 500/ jing)

  Access: 2008-03-12 20:19:45.000000000 0800

  Modify: 2008-03-12 20:19:45.000000000 0800

  Change: 2008-03-12 20:19:45.000000000 0800

  說明:Access訪問時間。Modify修改時間。Change狀態改變時間。可以stat *檢視這個目錄所有檔案的狀態

 列取所有檔案,並比較現在時間跟其建立時間的差,如果超過N天,則刪除.

問題分解開來是:

1. 取得某個目錄下面所有檔案

2. 取得檔案的建立日期

3. 取得當前日期跟其建立的日期差

4. 刪除檔案

為此,我寫了一個小程式來測試

  1: // TestFileFunction.cpp : Defines the entry point for the console application.

   2: //
   3:  
   4: #include "stdafx.h"
   5:  
   6:  
   7: #include <stdio.h>//remove
   8: #include <io.h>
   9: #include <sys/stat.h>// get file info
  10: #include <time.h>
  11:  
  12: #include <iostream>
  13: using namespace std;
  14:  
  15: int main(int argc, char* argv[])
  16: {
  17:     printf("Hello World!\n");
  18:     
  19:  
  20:     int iresult; 
  21:     struct _stat buf; //in stat head file
  22:     //_FILE__ means the current file. you can assign another file name. IE D:\\test.txt"£©
  23:     iresult = _stat(__FILE__,&buf); 
  24:     
  25:  
  26:     //the seconds from Greenwich 1970-1-1 to now.
  27:     printf("seconds of file create-time  from 1970 :%d\n", buf.st_atime);
  28:  
  29:     //convert to our define format
  30:     //struct tm *localtime(long *clock)
  31:     long* m_sencodes = &buf.st_atime;
  32:     struct tm* m_localTime = localtime(m_sencodes);
  33:     printf("file Local time : %d:%d:%d\n", m_localTime->tm_hour,m_localTime->tm_min, m_localTime->tm_sec);
  34:  
  35:     //Get the current time
  36:     //
  37:     long* mptr_currentSeconds = new long;
  38:     time(mptr_currentSeconds);
  39:     printf("current seconds from 1970 :%d\n", *mptr_currentSeconds);
  40:     m_localTime = localtime(mptr_currentSeconds);
  41:     printf("current Local time : %d:%d:%d\n", m_localTime->tm_hour,m_localTime->tm_min, m_localTime->tm_sec);
  42:  
  43:     //compare the two times£¬second
  44:     //double difftime(time_t time2,time_t time1) 
  45:     long diffSeconds = difftime(*mptr_currentSeconds, *m_sencodes);
  46:     
  47:     const int SECONDS_OF_DAY= 86400;
  48:  
  49:     //how many days?
  50:     int diffDays = diffSeconds/SECONDS_OF_DAY;
  51:     printf("diff time seconds: %d, days: %d\n", diffSeconds, diffDays);
  52:  
  53:  
  54:  
  55:  
  56:     delete mptr_currentSeconds;
  57:  
  58:     //ok, now we will list all files in one folder
  59:     struct _finddata_t c_file;
  60:     long hFile;
  61:     
  62:     if ( (hFile = _findfirst("*.*", &c_file)) == -1L )
  63:         printf("No *.* files in current directory");
  64:     else
  65:     {
  66:         do
  67:         {
  68:             //we show files except sub-directory
  69:             if (c_file.attrib != _A_SUBDIR)
  70:             {
  71:                 printf("%s\n", c_file.name);
  72:             }
  73:             
  74:         }         while ( _findnext(hFile, &c_file) == 0 ) ;
  75:             
  76:         _findclose(hFile);
  77:     }
  78:  
  79:  
  80:  
  81:  
  82:  
  83:     
  84:  
  85:  
  86:  
  87:  
  88:  
  89:  
  90:     cin.get();
  91:  
  92:     return 0;
  93: }
  94:  

最後附上的是,時間日期函式的參考

<sys/stat.h>

     struct stat {
         dev_t      st_dev;    /* device inode resides on */
         ino_t      st_ino;    /* inode's number */
         mode_t     st_mode;   /* inode's mode */
         nlink_t    st_nlink;  /* number of hard links to the file */
         uid_t      st_uid;    /* user ID of owner */
         gid_t      st_gid;    /* group ID of owner */
         dev_t      st_rdev;   /* device type, for special file inode */
         struct timespec st_atimespec;  /* time of last access */
         struct timespec st_mtimespec;  /* time of last data modification */
         struct timespec st_ctimespec;  /* time of last file status change */
         off_t      st_size;   /* file size, in bytes */
         int64_t    st_blocks; /* blocks allocated for file */
         u_int32_t  st_blksize;/* optimal file sys I/O ops blocksize */
         u_int32_t  st_flags;  /* user defined flags for file */
         u_int32_t  st_gen;    /* file generation number */
     };

時間的轉換

┌──────────────────────┐
│struct tm                                                     │
│{                                                                │
│ int tm_sec; /*秒,0-59*/                               │
│ int tm_min; /*分,0-59*/                               │
│ int tm_hour; /*時,0-23*/                              │
│ int tm_mday; /*天數,1-31*/                          │
│ int tm_mon; /*月數,0-11*/                           │
│ int tm_year; /*自1900的年數*/                     │
│ int tm_wday; /*自星期日的天數0-6*/             │
│ int tm_yday; /*自1月1日起的天數,0-365*/      │
│ int tm_isdst; /*是否採用夏時制,採用為正數*/   │
│}                                                                │
└──────────────────────┘
日期貯存結構date
┌───────────────┐
│struct date                              │
│{                                            │
│ int da_year; /*自1900的年數*/ │
│ char da_day; /*天數*/             │
│ char da_mon; /*月數 1=Jan*/ │
│}                                           │
└───────────────┘
時間貯存結構time
┌────────────────┐
│struct time                                 │
│{                                              │
│ unsigned char ti_min; /*分鐘*/    │
│ unsigned char ti_hour; /*小時*/  │
│ unsigned char ti_hund;               │
│ unsigned char ti_sec; /*秒*/       │
│                                │
└────────────────┘
char *ctime(long *clock)
本函式把clock所指的時間(如由函time返回的時間)轉換成數下列格式的字串:
Mon Nov 21 11:31:54 1983n
char asctime(struct tm *tm)
本函式把指定的tm結構類的時間轉換成下列格式的字串:
Mon Nov 21 11:31:54 1983n
double difftime(time_t time2,time_t time1)
計算結構time2和time1之間的時間差距(以秒為單位)
struct tm *gmtime(long *clock)
本函式把clock所指的時間(如由函式time返回的時間)轉換成格林威治時間,並以tm結構形式返回
struct tm *localtime(long *clock)
本函式把clock所指的時間(如函式time返回的時間)轉換成當地標準時間,並以tm結構形式返回
void tzset()本函式提供了對UNIX作業系統的相容性
long dostounix(struct date *dateptr,struct time *timeptr)
本函式將dateptr所指的日期,timeptr所指的時間轉換成UNIX格式, 並返回自格林威治時間1970年1月1日凌晨起到現在的秒數
void unixtodos(long utime,struct date *dateptr,struct time *timeptr)
本函式將自格林威治時間1970年1月1日凌晨起到現在的秒數utime轉換成DOS格式並保存於使用者所指的結構dateptr和timeptr中
void getdate(struct date *dateblk)
本函式將計算機內的日期寫入結構dateblk中以供使用者使用
void setdate(struct date *dateblk)
本函式將計算機內的日期改成由結構dateblk所指定的日期
void gettime(struct time *timep)
本函式將計算機內的時間寫入結構timep中, 以供使用者使用
void settime(struct time *timep)
本函式將計算機內的時間改為由結構timep所指的時間
long time(long *tloc)
本函式給出自格林威治時間1970年1月1日凌晨至現在所經過的秒數,並將該值存於tloc所指的單元中.
int stime(long *tp)本函式將tp所指的時間(例如由time所返回的時間)寫入計算機中.