●描述: ASP 線上升級類別●版本: 1.0.0
●作者: 蕭月痕(xiaoyuehen)
●MSN: xiaoyuehen(at)msn.com
●請將(at)以@ 替換●版權: 既然共享, 就無所謂版權了. 但必須限於網絡傳播, 不得用於傳統媒體!
●如果您能保留這些說明資訊, 本人更加感謝!
●如果您有更好的程式碼最佳化, 相關改進, 請記得告訴我, 非常感謝!
●思路:
1. 查詢版本清單=> 2. 比較版本差異=> 3. 取得高一版本更新清單, 若沒有更高版本則跳到步驟5 => 4. 更新=> 返回步驟3
5. 退出更新●其他說明: 增量升級.
●題外話: 總共花了大概7 個小時, 有點匆促, 代碼還不夠精細. 在本地測試時, 更新兩個版本, 共4 個文件, 花了將近1 秒的時間.
以前也沒有做過類似的東西, 所以談不上什麼算法, 有做過的朋友請多多提意見, 謝謝!
●本程式碼旨在互相交流●
●在開始之前, 請細讀如下說明.
●伺服器端需求:
1. 站點管理器, 能透過URL位址存取到版本及相關升級資訊即可.
2. 版本資訊檔, 如Version.asp
3. 各版本目錄必須在UrlUpdate(描述見下面) 指定的目錄之下, 例: UrlUpdate 為http://Localhost/__Jxc/Update/ ,
Version 為1.0.8 則此版本的升級檔必須位於http://Localhost/__Jxc/Update/108/下方.
4. 版本資訊傳回的資訊為一列表, 每行代表一個版本資訊(不能有空行), 高版本在上.如下格式:
1.1.0
1.0.8
1.0.0
5. 某一版本的檔案更新資訊格式為去除.號後的數字+ FileType(說明見下), 放在UrlUpdate 下 如: http://Localhost/__Jxc/Update/110.asp , 其內容格式如下:
3.htm|Test/Test/3.asp
4.htm|Test/Test/4.asp
5.htm|Test/5.asp
6.htm|Test/6.asp
以|分隔來源檔案和目的檔案. 來源檔案將從對應的版本目錄讀取, 如上3.htm 對應的位址應為
http://Localhost/__Jxc/Update/110/3.htm
若UpdateLocalPath = "/" 則Test/Test/3.asp 對應的更新目的為/Test/Test/3.asp, 在更新過程中程式會自動建立不存在的目錄,
並覆蓋目標檔案
●客戶端要求:
IIS 5.0 以上
FSO 支援(用於產生檔案)
Adodb.Stream 支援(用於編碼轉換)
Microsoft.XMLHTTP 支援(用於遠端取得資訊)
●屬性:
Info 取得升級過程中最後資訊●參數描述:
UrlVersion ●必須● 版本資訊完整URL, 以http:// 起頭
UrlUpdate ●必須● 升級URL, 以http:// 起頭, /結尾
UpdateLocalPath ●必須●本地更新目錄, 以/ 起頭, /結尾. 以/ 起頭是為當前站點更新.防止寫到其他目錄. ●預設值● /
UrlHistory ●必須● 產生的軟體歷史檔案檔案名稱
LocalVersion ●必須● 目前版本資訊●預設值● 1.0.0
FileType ●必須● 版本資訊後綴名●預設值● .asp
●方法描述:
doUpdate 升級
相關參數都設定好了之後, 即可以此方法開始長級●其他說明: 版本號必須為0-9的數字和.組成, 且第一位不能小於1, 各版本號長度必須一致.如1.0 .0和1.2.2 或1.2.04和1.2.78
●例:
程序代碼
<!--#include file="../__Inc/Cls_OnlineUpdate.asp"-->
<%
Dim objUpdate
Set objUpdate = New Cls_oUpdate
With objUpdate
.UrlVersion = " http://Localhost/__Jxc/Update/Version.asp "
.UrlUpdate = " http://Localhost/__Jxc/Update/ "
.UpdateLocalPath = "/"
.LocalVersion = "1.0.0"
.doUpdate
response.Write(.Info)
End With
Set objUpdate = Nothing
%>
類別文件:
程式碼
<%
Rem ################################################# #####################################
Rem ## 線上升級類別聲明
Class Cls_oUpdate
Rem ################################################# #################
Rem ## 說明: ASP 線上升級類
Rem ## 版本: 1.0.0
Rem ## 作者: 蕭月痕
Rem ## MSN: xiaoyuehen(at)msn.com
Rem ## 請將(at)以@ 替換
Rem ## 版權: 既然共享, 就無所謂版權了. 但必須限於網路傳播, 不得用於傳統媒體!
Rem ## 如果您能保留這些說明訊息, 本人更加感謝!
Rem ## 如果您有更好的程式碼優化, 相關改進, 請記得告訴我, 非常謝謝!
Rem ################################################# #################
Public LocalVersion, LastVersion, FileType
Public UrlVersion, UrlUpdate, UpdateLocalPath, Info
Public UrlHistory
Private sstrVersionList, sarrVersionList, sintLocalVersion, sstrLocalVersion
Private sstrLogContent, sstrHistoryContent, sstrUrlUpdate, sstrUrlLocal
Rem ################################################# #################
Private Sub Class_Initialize()
Rem ## 版本資訊完整URL, 以http:// 起頭
Rem ## 範例: http://localhost/software/Version.htm
UrlVersion = ""
Rem ## 升級URL, 以http:// 起頭, /結尾
Rem ## 範例: http://localhost/software/
UrlUpdate = ""
Rem ## 本地更新目錄, 以/ 起頭, /結尾. 以/ 起頭是為當前網站更新.防止寫到其他目錄.
Rem ## 程式將偵測目錄是否存在, 不存在則自動建立
UpdateLocalPath = "/"
Rem ## 產生的軟體歷史文件
UrlHistory = "history.htm"
Rem ## 最後的提示訊息
Info = ""
Rem ## 目前版本
LocalVersion = "1.0.0"
Rem ## 最新版本
LastVersion = "1.0.0"
Rem ## 各版本資訊檔後綴名
FileType = ".asp"
End Sub
Rem ################################################# #################
Rem ################################################# #################
Private Sub Class_Terminate()
End Sub
Rem ################################################# #################
Rem ## 執行升級動作
Rem ################################################# #################
Public function doUpdate()
doUpdate = False
UrlVersion = Trim(UrlVersion)
UrlUpdate = Trim(UrlUpdate)
Rem ## 升級網址偵測
If (Left(UrlVersion, 7) <> "http://") or (Left(UrlUpdate, 7) <> "http://") Then
Info = "版本偵測網址為空, 升級網址為空或格式錯誤(#1)"
Exit function
End If
If Right(UrlUpdate, 1) <> "/" Then
sstrUrlUpdate = UrlUpdate & "/"
Else
sstrUrlUpdate = UrlUpdate
End If
If Right(UpdateLocalPath, 1) <> "/" Then
sstrUrlLocal = UpdateLocalPath & "/"
Else
sstrUrlLocal = UpdateLocalPath
End If
Rem ## 目前版本資訊(數字)
sstrLocalVersion = LocalVersion
sintLocalVersion = Replace(sstrLocalVersion, ".", "")
sintLocalVersion = toNum(sintLocalVersion, 0)
Rem ## 版本偵測(初始化版本資訊, 並進行比較)
If IsLastVersion Then Exit function
Rem ## 開始升級
doUpdate = NowUpdate()
LastVersion = sstrLocalVersion
End function
Rem ################################################# #################
http://bizhi.downcodes.com/
Rem ## 偵測是否為最新版本
Rem ################################################# #################
Private function IsLastVersion()
Rem ## 初始化版本資訊(初始化sarrVersionList 陣列)
If iniVersionList Then
Rem ## 若成功, 則比較版本
Dim i
IsLastVersion = True
為 i = 0 to UBound(sarrVersionList)
If sarrVersionList(i) > sintLocalVersion Then
Rem ## 若有最新版本, 則退出循環
IsLastVersion = False
Info = "已經是最新版本!"
Exit For
End If
Next
Else
Rem ## 否則回傳出錯訊息
IsLastVersion = True
Info = "取得版本資訊時發生錯誤!(#2)"
End If
End function
Rem ################################################# #################
Rem ## 偵測是否為最新版本
Rem ################################################# #################
Private function iniVersionList()
iniVersionList = False
Dim strVersion
strVersion = getVersionList()
Rem ## 若傳回值為空, 則初始化失敗
If strVersion = "" Then
Info = "出錯......."
Exit function
End If
sstrVersionList = Replace(strVersion, " ", "")
sarrVersionList = Split(sstrVersionList, vbCrLf)
iniVersionList = True
End function
Rem ################################################# #################
Rem ## 偵測是否為最新版本
Rem ################################################# #################
Private function getVersionList()
getVersionList = GetContent(UrlVersion)
End function
Rem ################################################# #################
Rem ## 開始更新
Rem ################################################# #################
Private function NowUpdate()
Dim i
For i = UBound(sarrVersionList) to 0 step -1
Call doUpdateVersion(sarrVersionList(i))
Next
Info = "升級完成! <a href=""" & sstrUrlLocal & UrlHistory & """>查看</a>"
End function
Rem ################################################# #################
http://qqface.downcodes.com/
Rem ## 更新版本內容
Rem ################################################# #################
Private function doUpdateVersion(strVer)
doUpdateVersion = False
Dim intVer
intVer = toNum(Replace(strVer, ".", ""), 0)
Rem ## 若將更新的版本小於目前版本, 則退出更新
If intVer <= sintLocalVersion Then
Exit function
End If
Dim strFileListContent, arrFileList, strUrlUpdate
strUrlUpdate = sstrUrlUpdate & intVer & FileType
strFileListContent = GetContent(strUrlUpdate)
If strFileListContent = "" Then
Exit function
End If
Rem ## 更新目前版本號
sintLocalVersion = intVer
sstrLocalVersion = strVer
Dim i, arrTmp
Rem ## 取得更新檔案列表
arrFileList = Split(strFileListContent, vbCrLf)
Rem ## 更新日誌
sstrLogContent = ""
sstrLogContent = sstrLogContent & strVer & ":" & vbCrLf
Rem ## 開始更新
For i = 0 to UBound(arrFileList)
Rem ## 更新格式: 版本號碼/文件.htm|目的文件
arrTmp = Split(arrFileList(i), "|")
sstrLogContent = sstrLogContent & vbTab & arrTmp(1)
Call doUpdateFile(intVer & "/" & arrTmp(0), arrTmp(1))
Next
Rem ## 寫入日誌文件
sstrLogContent = sstrLogContent & Now() & vbCrLf
response.Write("<pre>" & sstrLogContent & "</pre>")
Call sDoCreateFile(Server.MapPath(sstrUrlLocal & "Log" & intVer & ".htm"), _
"<pre>" & sstrLogContent & "</pre>")
Call sDoAppendFile(Server.MapPath(sstrUrlLocal & UrlHistory), "<pre>" & _
strVer & "_______" & Now() & "</pre>" & vbCrLf)
End function
Rem ################################################# #################
Rem ## 更新文件
Rem ################################################# #################
Private function doUpdateFile(strSourceFile, strTargetFile)
Dim strContent
strContent = GetContent(sstrUrlUpdate & strSourceFile)
Rem ## 更新並寫入日誌
If sDoCreateFile(Server.MapPath(sstrUrlLocal & strTargetFile), strContent) Then
sstrLogContent = sstrLogContent & " 成功" & vbCrLf
Else
sstrLogContent = sstrLogContent & " 失敗" & vbCrLf
End If
End function
Rem ################################################# #################
Rem ## 遠端取得內容
Rem ################################################# #################
Private function GetContent(strUrl)
GetContent = ""
Dim oXhttp, strContent
Set oXhttp = Server.CreateObject("Microsoft.XMLHTTP")
'On Error Resume Next
With oXhttp
.Open "GET", strUrl, False, "", ""
.Send
If .readystate <> 4 Then Exit function
strContent = .Responsebody
strContent = sBytesToBstr(strContent)
End With
Set oXhttp = Nothing
If Err.Number <> 0 Then
response.Write(Err.Description)
Err.Clear
Exit function
End If
GetContent = strContent
End function
Rem ################################################# #################
Rem ################################################# #################
Rem ## 編碼轉換2進位=> 字串
Private function sBytesToBstr(vIn)
dim objStream
set objStream = Server.CreateObject("adodb.stream")
objStream.Type = 1
objStream.Mode = 3
objStream.Open
objStream.Write vIn
objStream.Position = 0
objStream.Type = 2
objStream.Charset = "GB2312"
sBytesToBstr = objStream.ReadText
objStream.Close
set objStream = nothing
End function
Rem ################################################# #################
Rem ################################################# #################
Rem ## 編碼轉換2進位=> 字串
Private function sDoCreateFile(strFileName, ByRef strContent)
sDoCreateFile = False
Dim strPath
strPath = Left(strFileName, InstrRev(strFileName, "", -1, 1))
Rem ## 偵測路徑及檔案名稱有效性
If Not(CreateDir(strPath)) Then Exit function
'If Not(CheckFileName(strFileName)) Then Exit function
'response.Write(strFileName)
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Dim fso, f
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile(strFileName, ForWriting, True)
f.Write strContent
f.Close
Set fso = nothing
Set f = nothing
sDoCreateFile = True
End function
Rem ################################################# #################
Rem ################################################# #################
Rem ## 編碼轉換2進位=> 字串
Private function sDoAppendFile(strFileName, ByRef strContent)
sDoAppendFile = False
Dim strPath
strPath = Left(strFileName, InstrRev(strFileName, "", -1, 1))
Rem ## 偵測路徑及檔案名稱有效性
If Not(CreateDir(strPath)) Then Exit function
'If Not(CheckFileName(strFileName)) Then Exit function
'response.Write(strFileName)
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Dim fso, f
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile(strFileName, ForAppending, True)
f.Write strContent
f.Close
Set fso = nothing
Set f = nothing
sDoAppendFile = True
End function
Rem ################################################# #################
Rem ## 建立目錄的程序,如果有多級目錄,則一級一級的創建
Rem ################################################# #################
Private function CreateDir(ByVal strLocalPath)
Dim i, strPath, objFolder, tmpPath, tmptPath
Dim arrPathList, intLevel
'On Error Resume Next
strPath = Replace(strLocalPath, "", "/")
Set objFolder = server.CreateObject("Scripting.FileSystemObject")
arrPathList = Split(strPath, "/")
intLevel = UBound(arrPathList)
For I = 0 To intLevel
If I = 0 Then
tmptPath = arrPathList(0) & "/"
Else
tmptPath = tmptPath & arrPathList(I) & "/"
End If
tmpPath = Left(tmptPath, Len(tmptPath) - 1)
If Not objFolder.FolderExists(tmpPath) Then objFolder.CreateFolder tmpPath
Next
Set objFolder = Nothing
If Err.Number <> 0 Then
CreateDir = False
Err.Clear
Else
CreateDir = True
End If
End function
Rem ################################################# #################
Rem ## 長整數轉換
Rem ################################################# #################
Private function toNum(s, default)
If IsNumeric(s) and s <> "" then
toNum = CLng(s)
Else
toNum = default
End If
End function
Rem ################################################# #################
End Class
Rem ################################################# #####################################
%>