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
- VC修改文件时间属性(修改/访问时间)
- [原]VC实现修改文件创建、访问、修改时间属性
- VC ++实现 对文件的 隐藏, 只读 ,创建时间 , 最后修改时间 ,最后访问时间 属性的修改
- VC ++实现 对文件的 隐藏, 只读 ,创建时间 , 最后修改时间 ,最后访问时间 属性的修改
- vc关于文件版本号,访问时间 修改时间
- nodejs-修改文件访问时间、修改时间
- VC++获取文件修改时间
- VC++获取文件修改时间
- MFC中获取文件的属性(包括文件创建时间、修改时间、访问时间、文件大小等)
- Linux 下修改文件的访问时间和修改时间属性
- 修改文件“访问和修改时间”
- 修改文件创建、修改、访问时间
- VC++ 获取文件属性创建时间、修改时间和访问时间
- 修改“文件修改时间”
- 文件的大小、创建时间、修改时间和访问时间
- 文件的创建时间 \修改时间 \访问时间
- 获取文件创建时间、最后修改时间、访问时间
- php获取文件创建时间、修改时间、访问时间
- C# lamda表达式学习
- JS中的call()和apply()方法
- 硬盘型号大全
- JDBCUtil
- NOJ1066堆排序
- VC修改文件时间属性(修改/访问时间)
- 平局不等于巴西平庸 韩国或可出线
- 工作小记
- Oracle forall介绍
- 如何获得一颗Visual Tree 的某个控件 WPF
- Fiddler (二) Script 用法
- android原生自带的分享功能
- 字段和属性的区别
- 我的Unity笔记本