如何实现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>
<%
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>
申明
非源创博文中的内容均收集自网上,若有侵权之处,请及时联络,我会在第一时间内删除.再次说声抱歉!!!
博文欢迎转载,但请给出原文连接。