zoukankan      html  css  js  c++  java
  • 如何实现ASP在线打包解包文件,存储格式XML版

      使用XML存储方式打包的文件大小会比原文件增大40%左右,所以一般情况下不推荐使用XML存储方式,推荐使用数据流文件或MDB文件存储方式。

    本文应用到的技术:
    ASP Microsoft.XMLDOM组件创建及操作XML文档(XML保存二进制数据),用到的相关方法及属性:.Load,.async,.AppendChild,.createProcessingInstruction,.CreateElement,.Save,.SelectSingleNode,.Text,.SetAttribute,.SetAttribute,.dataType,.nodeTypedValue,.selectNodes,.length,.nextSibling,.documentElement

    ASP Fso Scripting.FileSystemObject对象的GetFolder、FolderExists、CreateFolder方法的应用,GetFolder的Files(文件集合)、SubFolders(子文件夹)操作,遍历文件夹及文件

    ASP ADODB.Stream读取、写入文件,应用的相关属性及方法:.Type,.Open,.LoadFromFile,.Read,.Write,.Close

    ASP打包类 For XML实现源代码

     

    <%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
    <%
    Option Explicit
    Response.Buffer 
    = True
    Response.Charset 
    = "utf-8"
    Server.ScriptTimeout 
    = 999999999

    '文件打包类 To Xml
    '
    使用前请先确保目标文件具有读写权限,否则将因无法创建文件而导致程序出错
    '
     类属性:
    '
        PackFile    打包文件名,默认Pack.xml
    '
        PackPath    打包路径,默认程序所在目录"./"
    '
        UnPackFile    解包文件名,默认Pack.xml
    '
        UnPackPath    解包路径,默认程序所在目录"./"
    '
    类方法:
    '
        Pack        打包
    '
        UnPack        解包

    Class Pack2Xml

        
    Private dtmStart, dtmEnd
        
    Private strPackFile, strPackPath, strUnPackFile, strUnPackPath, strErr
        
    Private objXmlDoc, objFso, objStream

        
    ' Set Initialize
        Private Sub Class_Initialize
            dtmStart 
    = Timer()    ' 程序运行开始时间
            Call CheckObjInstalled("Microsoft.XMLDOM,Scripting.FileSystemObject,Adodb.Stream")    ' 测试所需环境
            Set objFso = Server.CreateObject("Scripting.FileSystemObject")
            
    Set objXmlDoc = Server.CreateObject("Microsoft.XMLDOM")
            
    Set objStream = Server.CreateObject("ADODB.Stream")
            strPackPath 
    = "./" ' 打包目录路径
            strPackFile = "Pack.xml" ' 打包文件名
            strPackPath = Server.MapPath(strPackPath) & "\"
            strPackFile 
    = Server.MapPath(strpackFile)
            strUnPackFile 
    = strPackFile
            strUnPackPath 
    = strPackPath
        
    End Sub
        
        
    ' Set Terminate
        Private Sub Class_Terminate
            
    Set objFso = Nothing
            
    Set objXmlDoc = Nothing
            
    Set objStream = Nothing
            dtmEnd 
    = Timer()    ' 程序执行结束时间
            Response.Write("程序执行时间:" & FormatNumber((dtmEnd-dtmStart),3& "秒<br />")
        
    End Sub

        
    ' Set PackPath
        Public Property Let PackPath(strPath)
            strPackPath 
    = Server.MapPath(strPath) & "\"
        
    End Property

        
    ' Set PackPath
        Public Property Let UnPackPath(strPath)
            strUnPackPath 
    = Server.MapPath(strPath) & "\"
        
    End Property

        
    ' Set pack file
        Public Property Let PackFile(strName)
            strPackFile 
    = Server.MapPath(strName)
        
    End Property

        
    ' Set unpack file
        Public Property Let UnPackFile(strName)
            strUnPackFile 
    = Server.MapPath(strName)
        
    End Property

        
    Public Sub Pack()
            
    Call CreateXml(strPackFile)
            objXmlDoc.async 
    = False
            objXmlDoc.load(strPackFile)
            Response.Write(
    "开始任务:执行打包目录:" & strPackPath & "<hr />")
            
    If objFSO.FolderExists(strPackPath) = False Then
                Response.Write(
    "目录不存在,终止操作。<br />")
                
    Exit Sub
            
    Else
                
    Call LoadData(strPackPath)
            
    End If
            Response.Write(
    "完成任务:数据文件保存于:" & strPackFile & "<hr />")
        
    End Sub

        
    Private Sub LoadData(DirPath)
            
    Dim objFolder, objSubFolder, objSubFolders, objFile, objFiles
            
    Dim objXFolder, objXFPath, objXFile, objXPath, objXStream
            
    Dim strPathName, strSubFolderPath

            Response.Write(
    "=========="& DirPath &"==========<br />")    ' 输出目录
            Response.Flush
            
    Set objFolder = objFso.GetFolder(DirPath)    ' 创建文件夹对象
            Set objXFolder = objXmlDoc.SelectSingleNode("//root").AppendChild(objXmlDoc.CreateElement("folder"))
            
    Set objXFPath = objXFolder.AppendChild(objXmlDoc.CreateElement("path"))
                objXFPath.Text 
    = Replace(DirPath,strPackPath,"")    ' 写入文件夹路径
            Set objFiles = objFolder.Files    ' 文件集合
            For Each objFile In objFiles    ' 遍历当前文件夹下的文件
                If LCase(DirPath & objFile.Name) <> LCase(Request.ServerVariables("PATH_TRANSLATED")) Then    ' 不对自己进行打包
                    strPathName = DirPath & objFile.Name
                    Response.Write strPathName 
    & "<br />"
                    Response.Flush
                    
    '写入文件的路径及文件内容
                    set objXFile = objXmlDoc.SelectSingleNode("//root").AppendChild(objXmlDoc.CreateElement("file"))
                    
    Set objXPath = objXFile.AppendChild(objXmlDoc.CreateElement("path"))
                        objXPath.Text 
    = replace(strPathName,strPackPath,"")
                    
    '以数据流方式读入文件内容,并写入XML文件中
                    With objStream
                        .Type 
    = 1
                        .Open()
                        .LoadFromFile(strPathName)
                    
    End With

                    
    Set objXStream = objXFile.AppendChild(objXmlDoc.CreateElement("stream"))
                    
    With objXStream
                        .SetAttribute 
    "xmlns:dt","urn:schemas-microsoft-com:datatypes"
                        .dataType 
    = "bin.base64"    ' 文件内容采用二进制存放
                        .nodeTypedValue = objStream.Read()
                    
    End With

                    objStream.Close
                    
    Set objXPath = Nothing
                    
    Set objXFile = Nothing
                    
    Set objXStream = Nothing
                
    End If
            
    Next
            Response.Write 
    "<p></p>"    ' 段落分隔符
            objXmlDoc.Save(strPackFile)
            
    Set objXFPath = Nothing
            
    Set objXFolder = Nothing
            
            
    Set objSubFolders = objFolder.SubFolders    ' 创建子文件夹对象
            For Each objSubFolder In objSubFolders    ' 调用递归遍历子文件夹
                strSubFolderPath = DirPath & objSubFolder.Name & "\"
                
    Call LoadData(strSubFolderPath)
            
    Next
            
    Set objFolder = Nothing
            
    Set objSubFolders = Nothing
        
    End Sub

        
    Public Sub UnPack()
            
    On Error Resume Next
            
    Dim objNodeList
            
    Dim intI, intJ
            Response.Write(
    "开始任务:解包文件:" & strUnPackFile & ",解包目录:" & strUnPackPath & "<hr />")
            objXmlDoc.async 
    = False
            objXmlDoc.load(strUnPackFile)
            
    If objXmlDoc.readyState = 4 Then
                
    If objXmlDoc.parseError.errorCode = 0 Then
                    
    Set objNodeList = objXmlDoc.documentElement.selectNodes("//folder/path")
                    intJ 
    = objNodeList.length - 1
                    Response.Write 
    "<strong>创建目录:</strong><br />"
                    
    For intI=0 To intJ
                        
    If objFSO.FolderExists(strUnPackPath & objNodeList(intI).text) = False Then
                            objFSO.CreateFolder(strUnPackPath 
    & objNodeList(intI).text)
                        
    End If
                        Response.Write objNodeList(intI).text 
    & "<br />"
                        Response.Flush
                    
    Next
                    
    Set objNodeList = Nothing
                    Response.Write 
    "<p></p>"    ' 段落分隔符
                    Set objNodeList = objXmlDoc.documentElement.selectNodes("//file/path")
                    intJ 
    = objNodeList.length - 1
                    Response.Write 
    "<strong>释放文件:</strong><br/>"
                    
    For intI=0 To intJ
                        
    With objStream
                            .Type 
    = 1
                            .Open
                            .Write objNodeList(intI).nextSibling.nodeTypedvalue
                            .SaveToFile strUnPackPath 
    & objNodeList(intI).text,2
                            .Close
                        
    End With
                        
    If Err Then    ' 可能出现:“写入文件失败。”的错误提示,这是因为在重写含有:只读、系统、隐藏的文件时会造成写入失败,与文件系统类型无关
                            Response.Write("<span style=""color:#FF0000"">"& Err.Description &"</span>")
                            Err.Clear
                        
    End If
                        Response.Write objNodeList(intI).text 
    & "<br/>"
                        Response.Flush
                    
    Next
                    
    Set objNodeList = Nothing
                
    End If
            
    End If
            Response.Write(
    "<p></p>完成任务<hr />")
        
    End Sub
        
        
    ' Check module install
        Private Sub CheckObjInstalled(strObj)
            
    On Error Resume Next
            
    Dim objTest
            
    Dim arrObj
            
    Dim intI
            arrObj 
    = Split(strObj,",")
            
    For intI = 0 To Ubound(arrObj,1)
                
    Set objTest = Server.CreateObject(arrObj(intI))
                
    If Err Then
                    Err.Clear
                    
    Call OutErr("检测运行所需环境时出现错误,请检查组件<strong>" & arrObj(intI) & "</strong>是否正常运行,程序终止。<br />")
                
    End If
                
    Set objTest = Nothing    
            
    Next
        
    End Sub

        
    ' Create new xml file
        Private Sub CreateXml(FilePath)
            objXmlDoc.async 
    = False
            objXmlDoc.appendChild(objXmlDoc.createProcessingInstruction(
    "xml","version='1.0' encoding='UTF-8'"))
            objXmlDoc.appendChild(objXmlDoc.CreateElement(
    "root"))
            objXmlDoc.Save(FilePath)
        
    End Sub

        
    Private Sub OutErr(strChar)
            Response.Write(strChar):Response.End()
        
    End Sub

    End Class
    %
    >

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>ASP XML打包解包工具</title>
    </head>

    <body>
    <%
    Dim objPack
    Set objPack = New Pack2Xml    ' 创建类实例

    If Request.QueryString("act"= "pack" Then
        
    'objPack.PackFile = "Pack.xml"
        'objPack.PackPath = "./"
        objPack.Pack    ' 执行打包
    Else
        
    'objPack.UnPackFile = "Pack.xml"
        'objPack.UnPackPath = "./"
        objPack.UnPack    ' 执行解包
    End If

    Set objPack = Nothing
    %
    >
    </body>
    </html>

     

     PACK ASP

    申明

    非源创博文中的内容均收集自网上,若有侵权之处,请及时联络,我会在第一时间内删除.再次说声抱歉!!!

    博文欢迎转载,但请给出原文连接。

  • 相关阅读:
    git
    Flask 上传文件 IO错误
    对0位压缩的 ipv6,进行补全
    字符编码
    struct 模块,pack 和 unpack,用法详细说明
    MySQLdb 操作数据库
    字节Byte 与 位bit 的关系
    vim
    python 内置函数 char
    time,datetime 模块
  • 原文地址:https://www.cnblogs.com/Athrun/p/1438337.html
Copyright © 2011-2022 走看看