程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> ASP編程 >> ASP技巧 >> ASP在線升級類及說明文件

ASP在線升級類及說明文件

編輯:ASP技巧

●描述: 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.knowsky.com/
  Rem ## 檢測是否為最新版本
  Rem #################################################################
   Private function IsLastVersion()
    Rem ## 初始化版本信息(初始化 sarrVersionList 數組)
    If iniVersionList Then
     Rem ## 若成功, 則比較版本
     Dim i
     IsLastVersion = True
     For 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.knowsky.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 #####################################################################################
%>

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved