VC修改文件时间属性(修改/访问时间)

来源:互联网 发布:苹果打谱软件mu 编辑:程序博客网 时间:2024/06/03 17:10

在Windows平台下,用Zlib解压文件。创建文件后时间全部是解压时创建的时间,感觉不妥就想着当文件解压完后修改文件时间属性就行了。原来没学过这些玩意,网上搜索大多都使用SetFileTime函数。我尝试着调用了一下,发现调用文件修改和访问时间和自己设置的有很大的误差。如下图:

这是修改之前。

这是修改之后。

这是用SetFileTime修改的代码

SYSTEMTIME st;FILETIME ft;st.wYear = 2007;st.wMonth = 8;st.wDay = 25;st.wHour = 15;st.wDayOfWeek = 5;st.wMinute =1;st.wSecond = 1;st.wMilliseconds = 1;HANDLE hFile = CreateFile(TEXT("F:/type.txt"), GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); if(hFile!=INVALID_HANDLE_VALUE){SystemTimeToFileTime(&st,&ft);int res=SetFileTime(hFile,&ft,&ft,&ft);CloseHandle(hFile);}

修改后的时间和我代码里面写的时间不一致。好像是SystemTimeToFileTime接口计算出错。不知道具体原因。然后Google找到另外一种解决办法就是用utime来修改(修改/访问)时间。

这是用_wutime函数修改之后的图,结果完全正确。

使用_wutime修改的代码

SYSTEMTIME st;FILETIME ft;st.wYear = 2007;st.wMonth = 8;st.wDay = 25;st.wHour = 15;st.wDayOfWeek = 5;st.wMinute =1;st.wSecond = 1;st.wMilliseconds = 1;_utimbuf mvTime;time_t rawtime;struct tm *timeinfo;timeinfo = localtime(&rawtime);timeinfo->tm_hour = st.wHour;timeinfo->tm_isdst = 0;timeinfo->tm_mday = st.wDay;timeinfo->tm_min = st.wMinute;timeinfo->tm_mon = st.wMonth;timeinfo->tm_sec = st.wSecond;timeinfo->tm_wday = DateWeek(st.wYear,st.wMonth,st.wDay);timeinfo->tm_yday = sum_day(st.wYear,st.wMonth,st.wDay);timeinfo->tm_year = st.wYear - 1900;mvTime.actime = mktime(timeinfo);mvTime.modtime = mktime(timeinfo);_wutime(TEXT("F:/type.txt"),&mvTime);
完整代码:

#include "stdafx.h"#include <iostream>#include <stdio.h>#include <stdlib.h>#include <direct.h>#include <Windows.h>#include <time.h>#include <sys/types.h>#include <sys/utime.h>int DateWeek(int year, int month, int day){if (month==1||month==2){year -=1;month +=12;}return (day+1+2*month+3*(month+1)/5+year+(year/4)-year/100+year/400)%7;}int sum_day(int year,int month,int day){int days = day;int day_month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};int i;for(i=1;i<month;i++)days += day_month[i];int leap=0;if((year%4==0&&year%100==0)||(year%400==0))leap=1;if(leap && month>=3)days=days+1;return days;}int _tmain(int argc, _TCHAR* argv[]){SYSTEMTIME st;FILETIME ft;st.wYear = 2007;st.wMonth = 8;st.wDay = 25;st.wHour = 15;st.wDayOfWeek = 5;st.wMinute =1;st.wSecond = 1;st.wMilliseconds = 1;#if 0_utimbuf mvTime;time_t rawtime;struct tm *timeinfo;timeinfo = localtime(&rawtime);timeinfo->tm_hour = st.wHour;timeinfo->tm_isdst = 0;timeinfo->tm_mday = st.wDay;timeinfo->tm_min = st.wMinute;timeinfo->tm_mon = st.wMonth;timeinfo->tm_sec = st.wSecond;timeinfo->tm_wday = DateWeek(st.wYear,st.wMonth,st.wDay);timeinfo->tm_yday = sum_day(st.wYear,st.wMonth,st.wDay);timeinfo->tm_year = st.wYear - 1900;mvTime.actime = mktime(timeinfo);mvTime.modtime = mktime(timeinfo);_wutime(TEXT("F:/type.txt"),&mvTime);#elseHANDLE hFile = CreateFile(TEXT("F:/type.txt"), GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); if(hFile!=INVALID_HANDLE_VALUE){SystemTimeToFileTime(&st,&ft);int res=SetFileTime(hFile,&ft,&ft,&ft);CloseHandle(hFile);}#endif}
希望对大家有点帮助。

参考:http://bbs.csdn.net/topics/80430679

http://zhidao.baidu.com/link?url=xQI3b-E017BnPeGZ_qCHBdIf_MuTgr1imluw2UQH2XOmp5KdpNa3pfD18eJzMhDi5P6R6YrHC8NjX4qdR3Spga

http://blog.163.com/jiangh_1982/blog/static/121950520088280322394/

0 0
原创粉丝点击