[原]VC实现修改文件创建、访问、修改时间属性
2013-07-18 14:27
555 查看
最近对VC实现修改文件创建、访问、修改时间属性的方法产生了兴趣,我便在网上查了这方面的教程,但是却总是看不明白,有的不够简洁。例如在一些文章中提到了使用FindFirstFile()函数和WIN32_FIND_DATA结构,我认为完全没有必要,因为到最后时我们需要用到SetFileTime()函数,而这个函数和FindFirstFile()是无关的,我们只需用到SYSTEMTIME和FILETIME结构体。如果感兴趣的话,你可以先看看微软的官方帮助和支持文档:FILETIME 结构使用信息,里面讲的不仅仅是FILETIME 结构的使用,很值得一看。
接着,设置日期和时间,我们这里设置成1999年1月1日 01:01:01:
HANDLE hFile, // 文件句柄
CONST FILETIME *lpCreationTime, // 文件创建时间
CONST FILETIME *lpLastAccessTime, // 最后访问时间
CONST FILETIME *lpLastWriteTime // 最后修改时间
);[/code]
struct _FILETIME { //结构体定义 DWORD dwLowDateTime; DWORD dwHighDateTime;} FILETIME;//FILETIME 结构表示 1601 年 1 月 1 日以来 100 纳秒为间隔数。结构包含的这两个DWORD值组合在一起//形成一个 64 位值的 32 位值。 struct _SYSTEMTIME { //这个结构体的成员实际上查查字典就知道什么意思了,呵呵 WORD wYear ; //年 WORD wMonth ;//月 WORD wDayOfWeek ; //星期,0=星期日,1=星期一... WORD wDay ; //日 WORD wHour ; //时 WORD wMinute ; //分 WORD wSecond ; //秒 WORD wMilliseconds ; //毫秒}SYSTEMTIME;
头文件:
[code] #include <windows.h> //只需要这一个
接着定义变量。
FILETIME Filetime; SYSTEMTIME Systemtime;
接着,设置日期和时间,我们这里设置成1999年1月1日 01:01:01:
Systemtime.wDay = 1; Systemtime.wYear = 1999; //记住,一定要大于1601,因为FILETIME的时间是从1601年1月1日开始的 //如果不大于1601,SetFileTime()会返回false,GetLastError() //返回78 (无效参数) Systemtime.wMonth = 1; Systemtime.wHour = 1; Systemtime.wMinute =1; Systemtime.wDayOfWeek = 1; Systemtime.wSecond = 1; Systemtime.wMilliseconds = 1;
转换SystemTime为Filetime结构:
[code] SystemTimeToFileTime( &Systemtime, &Filetime );
由于SetFileTime()需要文件句柄,所以只好用CreateFile()打开这个文件(微软官方实例)
[code] HANDLE hFile = CreateFile( "C:\\测试.txt", GENERIC_WRITE, //这个必须有 FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL );
总算快完成了,但是还有最关键的一步(写入): if (hFile != INVALID_HANDLE_VALUE) { SetFileTime( hFile, &Filetime, &Filetime, &Filetime ); CloseHandle(hFile); }
注:SetFileTime函数
函数原型:BOOL SetFileTime( //返回值:TRUE表示成功,FALSE表示失败
HANDLE hFile, // 文件句柄
CONST FILETIME *lpCreationTime, // 文件创建时间
CONST FILETIME *lpLastAccessTime, // 最后访问时间
CONST FILETIME *lpLastWriteTime // 最后修改时间
);[/code]
你运行试试看,是不是OK了?不,远远不是。我们来看看程序运行后文件的创建时间:
你会问,怎么是1999年1月1日,9:01:01?我们明明设置的是1999年1月1日,1:01:01啊!这个问题我也纠结了好半天,最后总算找到了答案:时区! 我国标准北京时间是GMT+8:00,所以你只要把时间GMT标准之间就可以了,不过还得再说明一下,如果你调成GMT(格林威治时间)的话,还是会有1小时的误差,也就是说Microsoft Windows的文件时间不是按的GMT(格林威治时间)来计算的。我们只要把时区调成GMT(协调世界时)就可以了。 或者,在程序中这样修改一下:[code] Systemtime.wDay = 31; Systemtime.wYear = 1998; Systemtime.wMonth = 12; Systemtime.wHour = 17; Systemtime.wMinute = 1; Systemtime.wDayOfWeek = 1; Systemtime.wSecond = 1; Systemtime.wMilliseconds = 1;
就可以了。
范例下载地址:(360云盘)
转载请注明:http://sunnysab.blog.163.com/
相关文章推荐
- VC实现修改文件创建、访问、修改时间属性(转载)
- VC ++实现 对文件的 隐藏, 只读 ,创建时间 , 最后修改时间 ,最后访问时间 属性的修改
- VC ++实现 对文件的 隐藏, 只读 ,创建时间 , 最后修改时间 ,最后访问时间 属性的修改
- VC++ 获取文件属性创建时间、修改时间和访问时间
- VC++ 获取文件属性创建时间、修改时间和访问时间
- MFC中获取文件的属性(包括文件创建时间、修改时间、访问时间、文件大小等)
- 如何访问一个文件的创建、修改时间、文件属性
- 修改文件(文件夹)的属性(隐藏,只读,存档,创建时间,最后访问时间,最后修改时间)
- MFC中修改文件属性(包括文件创建时间、文件修改时间、文件访问时间、文件大小等)
- 设置文件属性里的时间,包括:创建时间、访问时间、修改时间
- VC修改文件时间属性(修改/访问时间)
- Windows平台上修改某个文件的创建、访问、修改日期时间属性
- C# 获取文件的修改时间、访问时间、创建时间
- 如何实现Windows系统Users组用户可修改IP属性和限制Users组用户访问文件的权限!
- Web 在线文件管理器学习笔记与总结(2)显示文件列表(名称,类型,大小,可读,可写,可执行,创建时间,修改时间,访问时间)
- Linux目录与文件创建时间 / 修改时间 / 访问时间 / 指令 touch(鸟哥的Linux私房菜基础学习篇第三版-第七章)
- C#简单读取、改变文件的创建、修改及访问时间的方法
- C# 轻松读取、改变文件的创建、修改、访问时间 z
- linux下文件的创建时间、访问时间、修改时间和改变时间
- php获取文件创建时间、修改时间、访问时间