修改文件时间

 

 首先介绍一下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,用的是本地时间。
最后事例代码:

  1.  COleDateTime time(2009,
  2.   1,
  3.  1,
  4.  22,
  5.   7,
  6.   8  );
  7.  SYSTEMTIME modifyTime;
  8.  time.GetAsSystemTime(modifyTime);   
  9.  FILETIME fileTime;
  10.  ::SystemTimeToFileTime(&modifyTime, &fileTime);
  11.  HANDLE   hFile;   
  12.  hFile   =   CreateFile(   csFile,  
  13.   GENERIC_READ   |   GENERIC_WRITE,   
  14.   FILE_SHARE_READ|   FILE_SHARE_WRITE,   
  15.   NULL,   
  16.   OPEN_EXISTING,   
  17.   FILE_ATTRIBUTE_NORMAL,   
  18.   NULL   );   
  19.  FILETIME utcFileTime;
  20.  LocalFileTimeToFileTime(
  21.   &fileTime,
  22.   // address of local file time to convert 
  23.   &utcFileTime   // address of converted file time 
  24.   );
  25.  if (false == SetFileTime( hFile, 
  26.   NULL, 
  27.   NULL, 
  28.   &utcFileTime))
  29.  {
  30.   CloseHandle(hFile);
  31.   DWORD dw = GetLastError();
  32.   
  33.  }
  34.  CloseHandle(hFile);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值