呈上自写的自动更新类模块~
希望有高手能把它更加完善~
设计概念是~当执行档被执行时~
会去跑这个类比对Server上特定位置的档案~
如果发现有版本不同的情况~才会复制下来盖过~
因为不想另外写一支执行档来互Call~
所以必须得要执行档档名不同时功能才会生效~
以下示例是从我的一支小程式中抽取出来的一小段代码~
因为环环相扣,所以有些小地方会看得莫名其妙~
MainForm
程序代码:If CheckDomainName = True Then Call frmUpdata.CheckProgramVersion End If
frmUpdara
程序代码:
Option Explicit
Private WithEvents CompareVersion As ClsDtatCompare
Private Const ServerAddress = "???.???.???.???"
Private Const ServerPath = "\ABC"
Private Sub CompareVersion_SearchFileData(vData As String)
If vData <> "OK" Then
labUpdataResult.Caption = vData
DoEvents
Else
Unload Me
End If
End Sub
Private Sub CompareVersion_Updata(vData As Answer)
Dim Msg, Style, Title, Help, Ctxt, Response, MyString
Unload frmUpdata
Msg = "Do you want to Updata XILINX ?" '定義訊息。
Style = vbYesNo + vbInformation + vbDefaultButton2 '定義按鈕。
Title = "有新的更新檔案" '定義標題。
Help = "DEMO.HLP" '定義說明檔。
Ctxt = 1000 '定義內容代碼。
If vData = Whether Then
Response = MsgBox(Msg, Style, Title, Help, Ctxt) '顯示訊息。
If Response = vbYes Then '若使用者按下 [是]。
CompareVersion.UpAllData = Yes '產生相對回應。
ElseIf Response = vbNo Then '若使用者按下 [否]。
CompareVersion.UpAllData = No '產生相對回應。
Set CompareVersion = Nothing
End If
End If
End Sub
Private Sub Form_Load()
With labUpdataResult
.Top = 0
.Left = 0
.Height = frmUpdata.Height
.Width = frmUpdata.Width
.Caption = "程式版本檢查中 ..."
End With
' With frmUpdata
' .Top = labUpdataResult.Top
' .Left = labUpdataResult.Left
' .Height = labUpdataResult.Height
' .Width = labUpdataResult.Width
' End With
End Sub
Public Sub CheckProgramVersion()
Dim ServerPath As String
Dim Status As String
Set CompareVersion = New ClsDtatCompare
ServerPath = "\\" & ServerAddress & "ServerPath"
If IsFileExist(App.Path & "\Version.txt") = False Then Call WriteInfo(frmAbout)
With CompareVersion
.Filter = "*.*"
.LocalPath = App.Path
.TargetPath = IIf(IsFolderExist(ServerPath) = True, ServerPath, App.Path)
If UCase(Trim$(.TargetPath)) <> UCase(Trim$(.LocalPath)) Then
Status = IIf(.StartCopmare = True, "Updated Successfully !", "Updated Failure or Not updated !")
frmUpdata.labUpdataResult.Caption = Status
End If
End With
Set CompareVersion = Nothing
End Sub
Class
程序代码:
'自动更新类别
Option Explicit
Private Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long
Private Declare Function FileTimeToSystemTime Lib "kernel32" (lpFileTime As FILETIME, lpSystemTime As SYSTEMTIME) As Long
Private Const MaxLFNPath = 260
Private Const INVALID_HANDLE_VALUE = -1
Private Const FILE_ATTRIBUTE_READONLY = &H1
Private Const FILE_ATTRIBUTE_HIDDEN = &H2
Private Const FILE_ATTRIBUTE_SYSTEM = &H4
Private Const FILE_ATTRIBUTE_DIRECTORY = &H10
Private Const FILE_ATTRIBUTE_ARCHIVE = &H20
Private Const FILE_ATTRIBUTE_NORMAL = &H80
Private Const FILE_ATTRIBUTE_TEMPORARY = &H100
Private Const FILE_ATTRIBUTE_COMPRESSED = &H800
Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
Private Type WIN32_FIND_DATA
dwFileAttributes As Long
ftCreationTime As FILETIME
ftLastAccessTime As FILETIME
ftLastWriteTime As FILETIME
nFileSizeHigh As Long
nFileSizeLow As Long
dwReserved0 As Long
dwReserved1 As Long
cFileName As String * MaxLFNPath
cShortFileName As String * 14
End Type
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
Dim WFD As WIN32_FIND_DATA
Dim bgndir$, curpath$, schpattern$, aa$, fname$, progdisk$
Dim hItem&, hFile&, rtn&, i%, j%, k%, tfiles&, tfsize#, stopyn As Boolean 'Boolean 數據類型 (Visual Basic)存放只可能為 True 或 False 的值
Dim X1&, buff$
'Dim x1& 是Dim x1 As Long「長整型」& 是 As Long的縮寫,! 是 as single 的縮寫,例如:dim x0!,x1!,t!(或:dim x0 as single,x1 as single,t as single)
Public Enum Answer
Whether = 0
Yes
No
End Enum
Private Type FileStruct
FullFileStation As String
FileName As String
FilePath As String
FileSize As Long
FilesStatus As WIN32_FIND_DATA
FCreationTime As String
FLastAccessTime As String
FLastWriteTime As String
End Type
Private Type ServerFileList
S_FileList() As FileStruct
S_EXE_Ver As String
S_EXE_Name As String
S_FL_Count As Integer
End Type
Private Type LocalFileList
L_FileList() As FileStruct
L_EXE_Ver As String
L_EXE_Name As String
L_FL_Count As Integer
End Type
Private Type UpDataFileList
U_FileList() As FileStruct
U_EXE_Ver As String
U_EXE_Name As String
U_FL_Count As Integer
End Type
Private Type CompareFile_INFO
LocalPath As String
FileFilter As String
ServerPath As String
L_FileINFO As LocalFileList
S_FileINFO As ServerFileList
U_FileINFO As UpDataFileList
UserAnswer As Answer
End Type
Private CompFile() As CompareFile_INFO
'Class事件--------------------------------------------------------------
Public Event DataBack(vData As String, vData1() As String) '更新資料
Public Event Updata(vData As Answer) '是否更新
Public Event SearchFileData(vData As String) '搜尋過程
Public Property Let UpAllData(ByVal vData As Answer)
CompFile(0).UserAnswer = vData
If CompFile(0).UserAnswer = Yes Then
Call DownLoadFiles
End If
End Property
Private Sub Class_Initialize()
ReDim CompFile(0)
End Sub
Private Sub Class_Terminate()
Erase CompFile
End Sub
Public Property Let TargetPath(ByVal vData As String)
CompFile(0).ServerPath = vData
End Property
Public Property Get TargetPath() As String
TargetPath = CompFile(0).ServerPath
End Property
Public Property Let Filter(ByVal vData As String)
CompFile(0).FileFilter = vData
End Property
Public Property Let LocalPath(ByVal vData As String)
CompFile(0).LocalPath = vData
End Property
Public Property Get LocalPath() As String
LocalPath = CompFile(0).LocalPath
End Property
Public Function StartCopmare() As Boolean
StartCopmare = SearchFile
End Function
Public Function StartUpdata() As Boolean
StartUpdata = SearchFile
End Function
Private Function SearchFile() As Boolean
Dim s As String, i As Integer
Dim L_Ver As String, S_Ver As String, L_Temp() As String, S_Temp() As String, U_Temp() As String
Dim CompResult As Boolean
CompResult = False
With CompFile(0)
For i = 0 To 1
If .FileFilter = "" Then .FileFilter = "*.*"
If i = 0 Then s = Trim(.LocalPath)
If i = 1 Then s = Trim(.ServerPath)
bgndir = s '開始搜的文件夾
If InStr(bgndir, ":") = 0 And Len(bgndir) = 1 Then bgndir = bgndir & ":"
If Right(bgndir, 1) <> "\" Then bgndir = bgndir & "\"
schpattern = Trim(.FileFilter) '模糊搜索條件,例如 *.* 或 *.mp3 或 sc*.*
Call SearchDirs(bgndir, i)
Next i
SearchFile = True
.L_FileINFO.L_EXE_Name = UCase(Trim(App.EXEName) & App.Major & "." & App.Minor & "." & App.Revision & ".0" & ".exe")
.S_FileINFO.S_EXE_Name = UCase(Trim(.S_FileINFO.S_EXE_Name))
.L_FileINFO.L_EXE_Ver = Mid$(.L_FileINFO.L_EXE_Name, InStrRev(.L_FileINFO.L_EXE_Name, "V") + 1, InStrRev(.L_FileINFO.L_EXE_Name, "V") - Len(".EXE") - 1)
.S_FileINFO.S_EXE_Ver = Mid$(.S_FileINFO.S_EXE_Name, InStrRev(.S_FileINFO.S_EXE_Name, "V") + 1, InStrRev(.S_FileINFO.S_EXE_Name, "V") - Len(".EXE") - 1)
If .L_FileINFO.L_EXE_Name = .S_FileINFO.S_EXE_Name Or .L_FileINFO.L_EXE_Ver = .S_FileINFO.S_EXE_Ver Then
RaiseEvent SearchFileData("OK")
Else
If .L_FileINFO.L_EXE_Ver <> .S_FileINFO.S_EXE_Ver Then
If InStr(.L_FileINFO.L_EXE_Ver, ".") <> 0 And InStr(.S_FileINFO.S_EXE_Ver, ".") <> 0 Then
L_Temp = Split(.L_FileINFO.L_EXE_Ver, "."): S_Temp = Split(.S_FileINFO.S_EXE_Ver, ".")
If UBound(L_Temp) = UBound(S_Temp) Then
For i = 0 To UBound(L_Temp)
If Val(L_Temp(i)) = Val(S_Temp(i)) Then
CompResult = False
ElseIf Val(L_Temp(i)) < Val(S_Temp(i)) Then
CompResult = True
Exit For
End If
Next i
End If
If CompResult = True Then
Call All_DataCompare
RaiseEvent Updata(Whether)
Else
RaiseEvent DataBack("本地端程式版本較新,故不更新。", U_Temp())
End If
End If
End If
End If
End With
' If tfiles > 0 Then
' MsgBox "搜索完成,共查找到" & str(tfiles) & " 個文件" & vbCrLf & Chr(10) & "總佔空間: " & Format(str(tfsize), "#,###") & " Bytes"
' Else
' MsgBox "搜索完成,未找到符合的文件"
' End If
End Function
Private Sub SearchDirs(curpath, i As Integer)
Dim dirs%, dircount%, dirbuf$()
On Error Resume Next
RaiseEvent SearchFileData("正在查找 " & curpath)
DoEvents
hItem = FindFirstFile(curpath & "*", WFD)
If hItem <> INVALID_HANDLE_VALUE Then
Do
DoEvents
If stopyn Then Exit Do
If (WFD.dwFileAttributes And vbDirectory) And Asc(WFD.cFileName) <> 46 Then
If (dirs Mod 10) = 0 Then ReDim Preserve dirbuf(dirs + 10)
dirs = dirs + 1
dirbuf(dirs) = Left(WFD.cFileName, InStr(WFD.cFileName, vbNullChar) - 1)
End If
Loop While FindNextFile(hItem, WFD)
Call FindClose(hItem)
Call mohusearch(curpath, i)
End If
For dircount = 1 To dirs
DoEvents
If stopyn Then Exit For
SearchDirs curpath & dirbuf$(dircount) & "\", i
Next dircount
End Sub
Private Sub mohusearch(curpath, index As Integer)
Dim TempString As String
On Error Resume Next
hFile = FindFirstFile(curpath & schpattern, WFD)
If hFile <> INVALID_HANDLE_VALUE Then
Do
DoEvents
If stopyn Then Exit Do
aa = Trim(Trim(curpath) & Trim(WFD.cFileName))
If (WFD.dwFileAttributes And vbDirectory) Or Asc(WFD.cFileName) = 46 Then
Else
k = InStr(aa, Chr(0))
If k > 0 Then
fname = Mid(aa, 1, k - 1)
aa = Trim(fname) ' & "," & Format(str(FileLen(fname)), "####") & " Bytes"
tfiles = tfiles + 1
tfsize = tfsize + FileLen(fname)
TempString = ""
If index = 0 Then
With CompFile(0).L_FileINFO
ReDim Preserve .L_FileList(.L_FL_Count)
.L_FileList(.L_FL_Count).FullFileStation = aa
Call UpFilesStatus(.L_FileList(.L_FL_Count))
TempString = .L_FileList(.L_FL_Count).FullFileStation
.L_FileList(.L_FL_Count).FileName = Mid$(TempString, InStrRev(TempString, "\") + 1)
.L_FileList(.L_FL_Count).FileSize = FileLen(TempString)
.L_FileList(.L_FL_Count).FilePath = Mid$(TempString, 1, InStrRev(TempString, "\"))
If Right$(UCase(Trim(TempString)), 4) = UCase$(".EXE") Then
.L_EXE_Name = Trim(Mid$(TempString, InStrRev(TempString, "\") + 1))
End If
.L_FL_Count = .L_FL_Count + 1
End With
ElseIf index = 1 Then
With CompFile(0).S_FileINFO
ReDim Preserve .S_FileList(.S_FL_Count)
.S_FileList(.S_FL_Count).FullFileStation = aa
Call UpFilesStatus(.S_FileList(.S_FL_Count))
TempString = .S_FileList(.S_FL_Count).FullFileStation
.S_FileList(.S_FL_Count).FileName = Mid$(TempString, InStrRev(TempString, "\") + 1)
.S_FileList(.S_FL_Count).FileSize = FileLen(TempString)
.S_FileList(.S_FL_Count).FilePath = Mid$(TempString, 1, InStrRev(TempString, "\"))
If Right$(UCase(Trim(TempString)), 4) = UCase$(".EXE") Then
.S_EXE_Name = Trim(Mid$(TempString, InStrRev(TempString, "\") + 1))
End If
.S_FL_Count = .S_FL_Count + 1
End With
End If
TempString = ""
End If
End If
Loop While FindNextFile(hFile, WFD)
Call FindClose(hFile)
End If
End Sub
Private Function Findfile(xstrfilename) As WIN32_FIND_DATA
Dim Win32Data As WIN32_FIND_DATA
Dim plngFirstFileHwnd As Long
Dim plngRtn As Long
plngFirstFileHwnd = FindFirstFile(xstrfilename, Win32Data)
If plngFirstFileHwnd = 0 Then
Findfile.cFileName = "Error"
Else
Findfile = Win32Data
End If
plngRtn = FindClose(plngFirstFileHwnd)
End Function
Private Sub UpFilesStatus(FilesStuct As FileStruct)
Dim ftime As SYSTEMTIME
Dim tfilename As String
Dim filedata As WIN32_FIND_DATA
With FilesStuct
tfilename = .FullFileStation
filedata = Findfile(tfilename)
.FilesStatus.cFileName = WFD.cFileName
'
If filedata.nFileSizeHigh = 0 Then
.FilesStatus.nFileSizeHigh = filedata.nFileSizeLow ' & " Bytes"
Else
.FilesStatus.nFileSizeLow = filedata.nFileSizeHigh ' & "Bytes"
End If
'
Call FileTimeToSystemTime(filedata.ftCreationTime, ftime)
.FilesStatus.ftCreationTime = WFD.ftCreationTime
.FCreationTime = ftime.wDay & "/" & ftime.wMonth & "/" & ftime.wYear & " " & ftime.wHour & ":" & ftime.wMinute & ":" & ftime.wSecond
Call FileTimeToSystemTime(filedata.ftLastWriteTime, ftime)
.FilesStatus.ftLastWriteTime = WFD.ftLastWriteTime
.FLastWriteTime = ftime.wDay & "/" & ftime.wMonth & "/" & ftime.wYear & " " & ftime.wHour & ":" & ftime.wMinute & ":" & ftime.wSecond
Call FileTimeToSystemTime(filedata.ftLastAccessTime, ftime)
.FilesStatus.ftLastAccessTime = WFD.ftLastAccessTime
.FLastAccessTime = ftime.wDay & "/" & ftime.wMonth & "/" & ftime.wYear
'以下保留(暫無用處)
If (filedata.dwFileAttributes And FILE_ATTRIBUTE_HIDDEN) = FILE_ATTRIBUTE_HIDDEN Then
.FilesStatus.dwFileAttributes = FILE_ATTRIBUTE_HIDDEN
Else
.FilesStatus.dwFileAttributes = 0
End If
If (filedata.dwFileAttributes And FILE_ATTRIBUTE_SYSTEM) = FILE_ATTRIBUTE_SYSTEM Then
.FilesStatus.dwFileAttributes = FILE_ATTRIBUTE_SYSTEM
Else
.FilesStatus.dwFileAttributes = 0
End If
If (filedata.dwFileAttributes And FILE_ATTRIBUTE_READONLY) = FILE_ATTRIBUTE_READONLY Then
.FilesStatus.dwFileAttributes = FILE_ATTRIBUTE_READONLY
Else
.FilesStatus.dwFileAttributes = 0
End If
If (filedata.dwFileAttributes And FILE_ATTRIBUTE_ARCHIVE) = FILE_ATTRIBUTE_ARCHIVE Then
.FilesStatus.dwFileAttributes = FILE_ATTRIBUTE_ARCHIVE
Else
.FilesStatus.dwFileAttributes = 0
End If
If (filedata.dwFileAttributes And FILE_ATTRIBUTE_TEMPORARY) = FILE_ATTRIBUTE_TEMPORARY Then
.FilesStatus.dwFileAttributes = FILE_ATTRIBUTE_TEMPORARY
Else
.FilesStatus.dwFileAttributes = 0
End If
If (filedata.dwFileAttributes And FILE_ATTRIBUTE_NORMAL) = FILE_ATTRIBUTE_NORMAL Then
.FilesStatus.dwFileAttributes = FILE_ATTRIBUTE_NORMAL
Else
.FilesStatus.dwFileAttributes = 0
End If
If (filedata.dwFileAttributes And FILE_ATTRIBUTE_COMPRESSED) = FILE_ATTRIBUTE_COMPRESSED Then
.FilesStatus.dwFileAttributes = FILE_ATTRIBUTE_COMPRESSED
Else
.FilesStatus.dwFileAttributes = 0
End If
End With
End Sub
Private Sub All_DataCompare()
Dim i As Integer, j As Integer
Dim S_Temp As String, L_Temp As String
With CompFile(0)
For i = 0 To UBound(.S_FileINFO.S_FileList)
S_Temp = .S_FileINFO.S_FileList(i).FileName
For j = 0 To UBound(.L_FileINFO.L_FileList)
L_Temp = .L_FileINFO.L_FileList(j).FileName
If S_Temp = L_Temp Or (S_Temp <> L_Temp And Right(S_Temp, 4) = Right(L_Temp, 4) And Right(UCase(Trim(S_Temp)), 4) = ".EXE") Then
If .S_FileINFO.S_FileList(i).FileSize <> .L_FileINFO.L_FileList(j).FileSize Then
ReDim Preserve .U_FileINFO.U_FileList(.U_FileINFO.U_FL_Count)
If Right$(UCase$(Trim$(.S_FileINFO.S_EXE_Name)), 3) = "EXE" Then
.U_FileINFO.U_EXE_Name = .S_FileINFO.S_EXE_Name
.U_FileINFO.U_EXE_Ver = .S_FileINFO.S_EXE_Ver
End If
With .U_FileINFO.U_FileList(.U_FileINFO.U_FL_Count)
.FileName = S_Temp
.FilePath = CompFile(0).S_FileINFO.S_FileList(i).FilePath & "," & CompFile(0).L_FileINFO.L_FileList(j).FilePath
.FileSize = CompFile(0).S_FileINFO.S_FileList(i).FileSize
.FLastAccessTime = CompFile(0).S_FileINFO.S_FileList(i).FLastAccessTime
.FCreationTime = CompFile(0).S_FileINFO.S_FileList(i).FCreationTime
.FLastWriteTime = CompFile(0).S_FileINFO.S_FileList(i).FLastWriteTime
End With
.U_FileINFO.U_FL_Count = .U_FileINFO.U_FL_Count + 1
Else
L_Temp = ""
End If
Exit For
End If
Next j
S_Temp = "": L_Temp = ""
Next i
End With
End Sub
Private Sub DownLoadFiles()
Dim i As Integer
Dim SName As String, SPath As String, LPath As String
With CompFile(0)
For i = 0 To .U_FileINFO.U_FL_Count - 1
SName = .U_FileINFO.U_FileList(i).FileName
SPath = Trim(Mid$(.U_FileINFO.U_FileList(i).FilePath, 1, InStr(.U_FileINFO.U_FileList(i).FilePath, ",") - 1))
LPath = Trim(Mid$(.U_FileINFO.U_FileList(i).FilePath, InStrRev(.U_FileINFO.U_FileList(i).FilePath, ",") + 1))
FileCopy SPath & SName, LPath & SName
SName = "": SPath = "": LPath = ""
Next i
End With
End Sub







