首先介绍一下VC++提供的两个时间对象
与CTime相比, COleDateTime的优点在于它支持DWORD变量。COleDateTime使用的位数是双浮点的两倍,既然CTime只是简单地计算从1970年1月1日之后经过的秒数,
所以到了2 0 3 7年它将达到4 2 9 4 9 6 7 2 9 5,从而不能再使用。相反, COleDateTime是一个浮点数,它表示是从1 9 0 0年1 2月3 0号之后的天数(小时是天的小数部分),几千年之内不会溢出。
CTime是无符号long类型,它的范围是0-4 2 9 4 9 6 7 2 9 5;
COleDateTime是double类型,它占64位。
显然COleDateTime的范围要大很多。
当使用这两个对象作为标准修改文件时间的时候需要做的事情是:
1用正确的时间创建对象
2 将对象转化成SystemTime
两者都提供了GetAsSystemTime函数,非常容易
3把SystemTime转化成FileTime
值得注意的是通过GetAsSystemTime得到的时间是本地时间,而不是带有时区的UTC时间。那么就需要把本地时间转成UTC时间
4转换UTC
系统提供了LocalFileTimeToFileTime()API可以轻松转换
5获得文件句柄。
根据我们要修改的文件名及路径得到文件句柄
CreateFile()
6修改文件时间
SetFileTime()
需要注意的是在不同的文件系统中插入的时间会有所出入。NTFS系统中用8字节储存时间,可以精确到100ns(但目前系统没有这么精确记录文件时间,大概是精确到100ms),用的是UTC时间;FAT32文件系统用4字节储存时间,可以精确到2s,用的是本地时间。
最后事例代码:
- COleDateTime time(2009,
- 1,
- 1,
- 22,
- 7,
- 8 );
- SYSTEMTIME modifyTime;
- time.GetAsSystemTime(modifyTime);
- FILETIME fileTime;
- ::SystemTimeToFileTime(&modifyTime, &fileTime);
- HANDLE hFile;
- hFile = CreateFile( csFile,
- GENERIC_READ | GENERIC_WRITE,
- FILE_SHARE_READ| FILE_SHARE_WRITE,
- NULL,
- OPEN_EXISTING,
- FILE_ATTRIBUTE_NORMAL,
- NULL );
- FILETIME utcFileTime;
- LocalFileTimeToFileTime(
- &fileTime,
- // address of local file time to convert
- &utcFileTime // address of converted file time
- );
- if (false == SetFileTime( hFile,
- NULL,
- NULL,
- &utcFileTime))
- {
- CloseHandle(hFile);
- DWORD dw = GetLastError();
- }
- CloseHandle(hFile);