非常に優れた ASP コードです。この方法は、大きなファイルの圧縮には推奨されません。いくつかの小さなファイルを圧縮するのは簡単です。
<%@ 言語=VBScript %>
<% 明示的なオプション %>
<!--#include file=asptar.asp-->
<%
応答.バッファ = True
応答.クリア
Dim Co、Temp、T、x、i、fsoBrowse、フォルダー、サブフォルダー、ファイル パス、s、PH、objTar
Co=0
PH=./UpFile 「ファイル パス」は Upfile の下にあるすべてのファイルを圧縮します
objTar = 新しい Tarball を設定します
objTar.TarFilename=LvBBS_UpdateFile.rar 'パッケージ名
objTar.Path=PH
set fsoBrowse=CreateObject(Scripting.FileSystemObject)
theFolder=fsoBrowse.GetFolder(Server.Mappath(PH)) を設定します。
theSubFolders=theFolder.SubFolders を設定します
theFolder.Files 内の各 T について
Temp= Temp & T.Name & |
Co=Co+1
次
サブフォルダー内の各 x について
X.Files の各 i について
Temp= Temp & X.Name&/&i.Name&|
Co=Co+1
次
次
Co<1 の場合
Response.Write 現在、ダウンロードできる更新可能なファイルはありません。
'objTar.AddMemoryFile 申し訳ありませんが、.txt、ファイルではありません!
それ以外
Temp=Left(Temp,Len(Temp)-1)
FilePath=Split(Temp,|)
s=0 の場合、Ubound(FilePath) へ
objTar.AddFile Server.Mappath(PH&/&FilePath(s))
次
Response.IsClientConnected の場合
objTar.WriteTar
レスポンス.フラッシュ
終了の場合
終了の場合
ObjTar = なしを設定します
fsoBrowse= なしを設定します
フォルダー = なしを設定します
サブフォルダーを何も設定しない
%>
asptar.asp
<%
' UNIX Tarball 作成者
' ====================
著者: クリス・リード
' バージョン: 1.0.1
' ====================
'
' このクラスは、複数のファイルを 1 つのファイルにまとめてアーカイブする機能を提供します。
' tarball と呼ばれる配布可能ファイル (TAR は実際には Tape ARchive の略です)。
' これらは、非圧縮データを含む一般的な UNIX ファイルです。
'
では、これは何に役立つのでしょうか? 複数の機能を効果的に組み合わせることができます。
' ファイルを 1 つのファイルにまとめてダウンロードします。TAR ファイルは読み取り可能であり、抽出可能です。
' は、非常に広く配布されている WinZip を含む、さまざまなツールによって作成されます。
'
' このスクリプトには、各アーカイブに 2 種類のデータ (ディスクから読み取られたファイル データ、
' および文字列など、メモリから直接のものもアーカイブはファイルをサポートします。
' バイナリ構造なので、必要に応じて実行可能ファイルを保存することも、単に保存することもできます
' 文章。
'
このクラスは、いくつかのプロジェクトを支援するために開発され、プロジェクトを進めるたびに成長してきました。
' 実装。現在、アーカイブ目的で XML データを tarball するためにこのクラスを使用しています。
' これにより、動的に作成された何百もの XML ファイルを 1 回のダウンロードで取得できるようになります。
'
' 少数のプロパティとメソッドがあり、それらについては、
' 添付ドキュメント。
'
クラスタールボール
Public TarFilename ' 結果の tarball ファイル名
Public UserID ' UNIX ユーザー ID
Public UserName ' UNIX ユーザー名
Public GroupID ' UNIX グループ ID
Public GroupName ' UNIX グループ名
パブリック権限 ' UNIX 権限
Public BlockSize ' tarball のブロック バイト サイズ (デフォルト = 512)
Public IgnorePaths ' tarball 出力に指定されたパスを無視します
Public BasePath ' 各ファイルのベースパスを挿入します
公共の道
'ファイル情報の保管場所
プライベート objFiles、TmpFileName
プライベート objMemoryFiles
'ファイルリスト管理サブ、非常に基本的なもの
Public Sub AddFile(sFilename)
objFiles.Add sFilename,sFilename
エンドサブ
Public Sub RemoveFile(sFilename)
objFiles.Remove sFilename
エンドサブ
Public Sub AddMemoryFile(sFilename,sContents)
objMemoryFiles.Add sFilename,sContents
エンドサブ
Public Sub RemoveMemoryFile(sFilename)
objMemoryFiles.Remove sFilename
エンドサブ
' tarball をブラウザに送信します
パブリックサブWriteTar()
Dim objStream、objInStream、lTemp、aFiles
Set objStream = Server.CreateObject(ADODB.Stream) ' メイン ストリーム
Set objInStream = Server.CreateObject(ADODB.Stream) ' データの入力ストリーム
objStream.Type = 2
objStream.Charset = x-ansi ' 古き良き拡張 ASCII
objStream.Open
objInStream.Type = 2
objInStream.Charset = x-ansi
' 最初にディスクに保存されているすべてのファイルを調べます
aFiles = objFiles.Items
lTemp = 0 ~ UBound(aFiles) の場合
objInStream.Open
objInStream.LoadFromFile aFiles(lTemp)
objInStream.Position = 0
'エクスポートファイル aFiles(lTemp),objStream,objInStream
TmpFileName =replace(aFiles(lTemp),Server.Mappath(Path)&/,)
エクスポートファイル TmpFileName,objStream,objInStream
objInStream.Close
次
'メモリから内容を追加します
aFiles = objMemoryFiles.Keys
lTemp = 0 ~ UBound(aFiles) の場合
objInStream.Open
objInStream.WriteText objMemoryFiles.Item(aFiles(lTemp))
objInStream.Position = 0
エクスポートファイル aFiles(lTemp)、objStream、objInStream
objInStream.Close
次
objStream.WriteText String(BlockSize,Chr(0))
'ストリームを巻き戻す
' 忘れずにタイプをバイナリに戻してください。そうしないと書き込みが切り詰められます。
' 最初のゼロバイト文字以降。
objStream.Position = 0
objStream.Type = 1
' ブラウザに関するすべての設定を行う
Response.AddHeader Content-Disposition,filename= & TarFilename
Response.ContentType = application/x-tar
Response.BinaryWrite objStream.Read
「閉めて家に帰りなさい」
objStream.Close
objStream = なしを設定します
objInStream = なしを設定します
エンドサブ
' 各ファイルのヘッダーを作成し、ファイルの内容を送信します
Private Sub ExportFile(sFilename,objOutStream,objInStream)
薄暗く l 開始、 l 合計、 l 温度
lStart = objOutStream.Position ' 現在の位置を記録します
IgnorePaths の場合
' ファイル名にプレフィックスが付いたパスは無視されます
lTemp = InStrRev(sファイル名,/)
if lTemp <> 0 then
sFilename = Right(sFilename,Len(sFilename) - lTemp)
終了する場合
sファイル名 = ベースパス & sファイル名
終了の場合
' ヘッダーを構築します。データを除くすべては 8 進数の ASCII です
objOutStream.WriteText Left(sFilename & String(100,Chr(0)),100)
objOutStream.WriteText 100 & Right(000 & Oct(Permissions),3) & & Chr(0) 'ファイルモード
objOutStream.WriteText Right(String(6, ) & CStr(UserID),6) & & Chr(0) 'uid
objOutStream.WriteText Right(String(6, ) & CStr(GroupID),6) & & Chr(0) 'gid
objOutStream.WriteText Right(String(11,0) & Oct(objInStream.Size),11) & Chr(0) 'サイズ
objOutStream.WriteText Right(String(11,0) & Oct(dateDiff(s,1/1/1970 10:00,now())),11) & Chr(0) 'mtime (当日の午前 10 時からの秒数) 1970 年 1 月 1 日 (午前 10 時ですよね?)
objOutStream.WriteText 0 & String(100,Chr(0)) 'chksum、タイプ フラグとリンク名、実際のチェックサムが正しく計算されるようにすべての空白を書き出します
objOutStream.WriteText ustar & Chr(0) ' マジックとバージョン
objOutStream.WriteText Left(UserName & String(32,Chr(0)),32) 'uname
objOutStream.WriteText Left(GroupName & String(32,Chr(0)),32) 'gname
objOutStream.WriteText 40 & String(4,Chr(0)) 'devmajor、devminor
objOutStream.WriteText String(167,Chr(0)) 'プレフィックスとリーダー
objInStream.CopyTo objOutStream ' データをストリームに送信します
if (objInStream.Size Mod BlockSize) > 0 then
objOutStream.WriteText String(BlockSize - (objInStream.Size Mod BlockSize),Chr(0)) '最も近いブロック バイト境界へのパディング
終了する場合
' ヘッダーのチェックサムを計算します
l合計 = 0
objOutStream.Position = lStart
lTemp = 1 から BlockSize まで
lSum = lSum + (Asc(objOutStream.ReadText(1)) および &HFF&)
次
'挿入してください
objOutStream.Position = lStart + 148
objOutStream.WriteText Right(String(7,0) & Oct(lSum),7) & Chr(0)
' ストリームの最後に移動
objOutStream.Position = objOutStream.Size
エンドサブ
「すべてを始めましょう」
プライベートサブクラス_Initialize()
objFiles = Server.CreateObject(Scripting.Dictionary) を設定します
objMemoryFiles = Server.CreateObject(Scripting.Dictionary) を設定します。
ブロックサイズ = 512
権限 = 438 ' UNIX 666
ユーザーID = 0
ユーザー名 = root
グループID = 0
グループ名 = ルート
IgnorePaths = False
ベースパス =
TarFilename = new.tar
エンドサブ
プライベートサブクラス_Terminate()
objMemoryFiles = なしを設定します
objFiles = なしを設定します
エンドサブ
終了クラス
%>