基于VB和API函数实现文件时间属性的获取和设置

时间:2022-10-11 03:03:29

基于VB和API函数实现文件时间属性的获取和设置

摘要:在数据备份时难以保持文件原来的时间属性,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.

上一篇:漫游系统的设计原理 下一篇:VB中基于OLE的图形功能的实现