摘要:在數據備份時難以保持文件原來的時間屬性,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
(1.Computer 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.