时间:2022-10-11 03:03:29
摘要:在数据备份时难以保持文件原来的时间属性,Windows也没有提供直接设置时间属性的工具。对此,首先介绍了API函数和时间格式,总结出利用VB和API解决问题的方法,具有良好的应用前景。
关键词:VB;API;时间属性
中图分类号:TP311文献标识码:A文章编号:1009-3044(2008)35-2161-02
Obtain and Modify the File's Time Attributes Based on VB and API
GUO Nian1,GONG De-long2
(puter Center,Henan University,Kaifeng 475001,China;2.Basic Experiment Teaching Center,Henan University, Kaifeng 475004,China)
Abstract:The original time attributes is difficult to maintain in the data backup. And Windows does not provide a direct way to modify attributes. The article introduces API functions and Windows time formats at first, and based on VB and API functions summarizes a solution to the problem. The solution has a good prospect of application.
Key Word:VB;API;time attributes
1 引言
对于很多计算机用户而言,数据备份就是备份数据内容本身,很少涉及到文件的时间属性。在某些对数据管理有着非常严格要求的特殊行业中,备份文件的时间属性也十分重要。但在目前Windows操作系统下,数据备份难以保持文件原来的时间属性,Windows操作系统也没有提供直接设置时间属性的方法和工具。笔者对此问题做了深入研究,并总结出一种解决此题的方法。
VB采用可视化编程技术、面向对象的事件驱动机制,能够快速地开发各种应用程序。然而VB在功能上具有局限性,不能直接控制和处理计算机的系统参数和硬件资源。为了增强VB的开发能力,VB提供了访问Windows API的方法。本文阐述了在VB平台上,利用Windows API函数,来获取和设置文件的时间属性。
2 Windows API函数简介
Windows API(Application Programming Interface)是操作系统支持的函数定义、参数定义和消息格式的集合, API函数主要包含在三个动态链接库(DLL),分别是User32.dll、kernel32.dll和GDI.dll。对于VB应用程序而言,API函数是外部过程,VB必须先声明后调用。API函数的声明通过Declare语句来实现,声明格式有两种:
格式一:有返回值的Function过程声明:
Declare Function API函数名Lib“库名”[Alias“别名”]([参数列表])As类型
格式二:无返回值的Sub过程声明:
Declare Sub API函数名Lib“库名”[Alias“别名”]([参数列表])
其中“API函数名”指的是DLL中的函数名,也是VB应用程序中使用的过程名;“库名”表示函数所在的动态链接库,是DLL文件的名称;“别名”(Alias)一般情况下不使用;“参数列表”用来指定传给API函数的参数,参数的传递形式由函数自身决定,不由用户选择。具体步骤是:
1) 通过外接程序管理器加载VB 6.0 API Viewer外接程序;
2) 在API Viewer应用程序窗口中,打开Win32api.txt文件,查找到所需声明的API函数和类型定义,并进行复制;
3) 将前面复制的API函数和类型定义复制到工程的窗体模块、标准模块或类模块中。
3 获取和设置文件的时间属性
文件的时间属性是指文件的创建时间、最后一次修改时间和上一次访问时间,备份数据时往往无法复制原来的属性。在VB平台上,要获取和设置文件的时间属性,需要借助API函数GetFileTime和SetFileTime来实现。
3.1 时间格式转换
在GetFileTime和SetFileTime函数原型中,参数lpCreationTime、lpLastAccessTime和lpLastWriteTime都采用了FILETIME结构,是Windows的一种时间格式。此结构保存一个64位二进制数值,有两个长整型(Long)字段,表示从1601年1月1日起的100毫微秒间隔数,称为UTC时间(格林尼治时间),其结构声明如下:
Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
在此结构中,我们无法直接识别出年、月、日、时、分、秒等信息,而Windows的另一种时间格式可以解决此问题,就是SYSTEMTIME时间格式。它是一个包含有年、月、星期、日、小时、分、秒、微秒这些成员的结构,其结构声明如下:
Private Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type
针对上述两种结构,Windows提供了专门的API函数来实现相互间的转换。因此,使用GetFileTime获取文件时间属性后,需要先调用FileTimeToLocalTime消除时差,再调用FileTimeToSystemTime,把FILETIEME格式转换为SYSTEMTIME格式便于识别;使用SetFileTime设置文件时间属性前,也需要调用SystemTimeToFileTime把SYSTEMTIME格式转化为FILETIEME格式用于设置时间属性。
3.2 获取和设置文件时间属性的实现
在使用GetFileTime和SetFileTime函数获取或设置文件的时间属性时,需要先获取指定文件的句柄,之后并关闭已打开文件的句柄。具体而言,首先使用函数CreateFile打开文件对象,获取文件句柄;然后调用函数GetFileTime和SetFileTime获取和设置文件的时间属性;最后使用函数CloseHandle关闭文件句柄。
1) 获取指定文件的时间属性,其中入口参数scrFile指定了待处理的文件, stime用来保存获取的文件时间属性。关键代码如下:
' 获取指定文件的句柄
HANDLE hDir = CreateFile(scrFile, GENERIC_READ, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0&, OPEN_EXISTING, 0, 0)
' 获取文件时间属性信息
GetFileTime hDir, lpCreationTime, lpLastAccessTime, lpLastWriteTime
CloseHandle(hDir)'关闭打开过的句柄
2) 设置指定文件的时间属性,其中入口参数destFile指定了待处理的文件,new_stime为指定时间,关键代码如下:
'获取指定文件的句柄
HANDLE hDir = CreateFile(destFile, GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0&, OPEN_EXISTING, 0, 0)
'设置文件的时间属性
SetFileTime hDir,lpCreationTime, lpLastAccessTime, lpLastWriteTime CloseHandle(hDir)'关闭打开过的句柄
在上述代码中,stime和new_stime均为SYSTEMTIME结构,其他时间参数为FILETIME结构,具体代码由读者自行实现。
4 结语
本文通过使用VB和API函数来对任意文件的时间属性进行获取与写入处理,在数据的完整备份与复原等方面中有较好的应用前景。本文所述代码在Windows XP Professional下,由Microsoft Visual Basic 6.0编译通过。
参考文献:
[1] Roman S.Visual Basic Win32 API编程[M].北京:中国电力出版社,2001.
[2] 冉林仓.WINDOWS API编程[M].北京:清华大学出版社,2005.
[3] 申石磊,张东生.Visual Basic程序设计[M].北京:中国科学技术出版社,2007:37-40.
[4] 林永,张乐强.Visual Basic 6.0用户编程手册[M].2版.北京:人民邮电出版社,2002.