• C++ 如何获取目录下面的文件/文件的创建时间


    我手上有一个C++程序会生成一些临时文件,过期以后希望能够删除. 到达成这个目的,我需要做到:

    根据提供的路径,

    列取所有文件,并比较现在时间跟其创建时间的差,如果超过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所返回的时间)写入计算机中.

  • 相关阅读:
    推荐系统实践
    python实现itemCF and userCF
    Mahout分步式程序开发 基于物品的协同过滤ItemCF
    用Maven构建单机Mahout项目
    Apache Mahout:适合所有人的可扩展机器学习框架
    mahout0.7 示例运行纪实
    win7基于mahout推荐之用户相似度计算
    cygwin
    Mahout初体验
    Android慎用layout嵌套, 尽量控制在5层下面java.lang.StackOverflowError
  • 原文地址:https://www.cnblogs.com/king_astar/p/1575107.html
Copyright © 2020-2023  润新知