最近对VC实现修改文件创建、访问、修改时间属性的方法产生了兴趣,我便在网上查了这方面的教程,但是却总是看不明白,有的不够简洁。例如在一些文章中提到了使用FindFirstFile()
函数和WIN32_FIND_DATA
结构,我认为完全没有必要,因为到最后时我们需要用到SetFileTime()
函数,而这个函数和FindFirstFile()
是无关的,我们只需用到SYSTEMTIME
和FILETIME
结构体。如果感兴趣的话,你可以先看看微软的官方帮助和支持文档:FILETIME 结构使用信息,里面讲的不仅仅是FILETIME
结构的使用,很值得一看。
1 | struct _FILETIME { //结构体定义 |
头文件:
1 |
接着定义变量。
1 | FILETIME Filetime; |
接着,设置日期和时间,我们这里设置成1999年1月1日 01:01:01:
1 | Systemtime.wDay = 1; |
转换SystemTime为Filetime结构:
1 | SystemTimeToFileTime( &Systemtime, &Filetime ); |
由于SetFileTime
需要文件句柄,所以只好用CreateFile
打开这个文件(微软官方实例)
1 | HANDLE hFile = CreateFile( "C:\\测试.txt", |
总算快完成了,但是还有最关键的一步(写入):
1 | if (hFile != INVALID_HANDLE_VALUE) |
注:SetFileTime函数
函数原型:
1 | BOOL SetFileTime( //返回值:TRUE表示成功,FALSE表示失败 |
你运行试试看,是不是OK了?不,远远不是。我们来看看程序运行后文件的创建时间:
你会问,怎么是1999年1月1日,9:01:01?我们明明设置的是1999年1月1日,1:01:01啊!这个问题我也纠结了好半天,最后总算找到了答案:时区!
我国标准北京时间是GMT+8:00,所以你只要把时间GMT标准之间就可以了,不过还得再说明一下,如果你调成GMT(格林威治时间)的话,还是会有1小时的误差,也就是说Microsoft Windows的文件时间不是按的GMT(格林威治时间)来计算的。我们只要把时区调成GMT(协调世界时)就可以了。
或者,在程序中这样修改一下:
1 | Systemtime.wDay = 31; |
就可以了。
范例下载地址:(360云盘)(已失效)
转载请注明:http://sunnysab.blog.163.com/ (现迁移到 https://sunysab.cn/ )