文件的时间属性一般包括:创建时间、最后修改时间、最后访问时间。一般的获取方法是:“右键”鼠标---->“属性”。而对于时间的修改则不能随意进行,尤其是创建时间。本文通过代码实现对文件时间属性的获取、修改。
1、文件时间属性获取
以"123.doc”文件为例(该文件置于代码同一路径,下同),获取其最后访问时间,其他两项时间属性同理:
#include<iostream>
#include<Windows.h>
using namespace std;
int main()
{
HANDLE hFile=CreateFile( "123.doc", // 文件名指针
GENERIC_WRITE,// 访问模式
FILE_SHARE_READ, // 共享模式
NULL, //安全属性
OPEN_EXISTING, // 创建方式
FILE_ATTRIBUTE_NORMAL, // 文件属性
NULL // 指向待复制属性的文件指针
);
FILETIME createTime;
FILETIME lastAccessTime;//本例获取最后访问时间,其他两项同理
FILETIME lastWriteTime;
if(INVALID_HANDLE_VALUE!=hFile)
{
if (GetFileTime(hFile,&createTime,&lastAccessTime,&lastWriteTime))
{
SYSTEMTIME st;
memset(&st,0x0,sizeof(st));
FileTimeToSystemTime(&lastAccessTime,&st);//将文件时间格式转换为系统时间格式(UTC格式),可以看到小时数比真实的小了8
TIME_ZONE_INFORMATION tz;
::GetTimeZoneInformation(&tz);//获取当地时区信息
SYSTEMTIME localST;
::SystemTimeToTzSpecificLocalTime(&tz,&st,&localST);//将UTC时间格式转换为当地时间格式,因为中国是东8区,所以转换时在小时上加了8(本函数转换时自动加的)
printf("最后访问时间为: %d年%d月%d日 %d:%d:%d\n",localST.wYear,localST.wMonth,localST.wDay,localST.wHour,localST.wMinute,localST.wSecond);
}
}
CloseHandle(hFile);
return 0;
}
2、时间属性的修改
仍以“123.doc”为例,对文件的创建时间进行修改。具体代码如下:
#include<iostream>
#include<Windows.h>
using namespace std;
BOOL
SetFileTimeToNewCreateTime(HANDLE hFile,int year,int month,int day,int hour,int minute,int second,int DayofWeek/*星期:0-6*/,int Milliseconds/*毫秒值*/)
{ FILETIME ft;
SYSTEMTIME st;//根据已知数据创造st,即系统时间格式
st.wYear=year;
st.wMonth=month;
st.wDay=day;
st.wHour=hour;
st.wMinute=minute;
st.wSecond=second;
st.wDayOfWeek=DayofWeek;
st.wMilliseconds=Milliseconds;
SystemTimeToFileTime(&st, &ft); // 转化为文件时间格式
BOOL f = SetFileTime(hFile,
&ft , //创建时间参数
(LPFILETIME) NULL,//访问时间(参数为NULL则为不修改)
(LPFILETIME) NULL//最后修改时间(同上)
);
return f;
}
int main()
{
HANDLE hFile=CreateFile( "123.doc", // 文件名指针
GENERIC_WRITE,// 访问模式
FILE_SHARE_READ, // 共享模式
NULL, //安全属性
OPEN_EXISTING, // 创建方式
FILE_ATTRIBUTE_NORMAL, // 文件属性
NULL // 指向待复制属性的文件指针
);
if(SetFileTimeToNewCreateTime(2012,9,27,8,8,8,4/*星期*/,0))//注意:星期与日期相关!
printf("更改成功");
else
printf("更改失败!");
CloseHandle(hFile);
return 0;
}