C++ stat处理文件属性

用stat函数可以得到诸如修改时间,所有者,文件权限等文件属性。

wgs2sgf在处理对局日期时,由于无法在wgs文件中找到对局时间方面的信息,受贴吧一大神启发,将文件的修改时间作为对局日期:

string wgsFile::getdate(char* filepath)
{
	read_wgs.open(filepath);
	isfileopen(filepath);

	struct stat statbuf;
	stat(filepath, &statbuf);		/* get information about the file */ 

	read_wgs.close();

	long *m_second=&statbuf.st_mtime;				//st_mtime 文件内容最后一次修改时间(Unix时间戳) 对于wgs棋谱来说基本就是初次创建时间,即对局时间
	struct tm *m_localtime=localtime(m_second);		//localtime将时间戳转换为本地时间

	stringstream stream;
	stream<<"DT["<<m_localtime->tm_year+1900<<"-"<<m_localtime->tm_mon+1<<"-"<<m_localtime->tm_mday<<"]";
	stream>>date;
	stream.clear();
	stream.str("");
	return date;
}

windows中需要用MinGW编译。

下面是函数参考:

<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所返回的时间)写入计算机中.

参考:http://www.cnblogs.com/king_astar/archive/2009/09/27/1575107.html

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注