Sehr guter ASP-Code. Bei großen Dateien ist es einfach, einige kleine Dateien zu komprimieren.
<%@ Language=VBScript %>
<% Option Explicit %>
<!--#include file=asptar.asp-->
<%
Response.Buffer = True
Antwort.Klar
Dim Co,Temp,T,x,i,fsoBrowse,theFolder,TheSubFolders,FilePath,s,PH,objTar
Co=0
PH=./UpFile 'Dateipfad' komprimiert alle Dateien unter Upfile
Setze objTar = Neuer Tarball
objTar.TarFilename=LvBBS_UpdateFile.rar 'Paketname
objTar.Path=PH
set fsoBrowse=CreateObject(Scripting.FileSystemObject)
Setzen Sie theFolder=fsoBrowse.GetFolder(Server.Mappath(PH))
Legen Sie theSubFolders=theFolder.SubFolders fest
Für jedes T in theFolder.Files
Temp= Temp & T.Name & |
Co=Co+1
Nächste
Für jedes x in den Unterordnern
Für jedes i in X.Files
Temp= Temp & X.Name&/&i.Name&|
Co=Co+1
Nächste
Nächste
Wenn Co<1, dann
Response.Write Derzeit steht keine aktualisierbare Datei zum Herunterladen zur Verfügung.
'objTar.AddMemoryFile Sorry.txt, keine Datei!
Anders
Temp=Left(Temp,Len(Temp)-1)
FilePath=Split(Temp,|)
Für s=0 zu Ubound(FilePath)
objTar.AddFile Server.Mappath(PH&/&FilePath(s))
Nächste
Wenn Response.IsClientConnected, dann
objTar.WriteTar
Response.Flush
Ende wenn
Ende wenn
Setze ObjTar = Nothing
Setze fsoBrowse= Nichts
Setzen Sie theFolder = Nothing
Setzen Sie theSubFolders = Nothing
%>
asptar.asp
<%
' UNIX-Tarball-Ersteller
' ====================
' Autor: Chris Read
' Version: 1.0.1
' ====================
'
' Diese Klasse bietet die Möglichkeit, mehrere Dateien zusammen in einer einzigen zu archivieren
' verteilbare Datei namens Tarball (Das TAR steht eigentlich für Tape Archive).
' Dies sind gängige UNIX-Dateien, die unkomprimierte Daten enthalten.
'
„Wofür ist das also nützlich? Nun, es ermöglicht Ihnen, mehrere effektiv zu kombinieren
' Dateien in einer einzigen Datei zum Herunterladen zusammenfassen. Die TAR-Dateien sind lesbar und extrahierbar
' durch eine Vielzahl von Tools, einschließlich des sehr weit verbreiteten WinZip.
'
' Dieses Skript kann zwei Arten von Daten in jedes Archiv einbinden: Dateidaten, die von einer Festplatte gelesen werden,
' und auch Dinge direkt aus dem Speicher, wie aus einer Zeichenfolge. Die Archive unterstützen Dateien in
' eine Binärstruktur, sodass Sie bei Bedarf ausführbare Dateien speichern oder einfach nur speichern können
' Text.
'
„Dieser Kurs wurde entwickelt, um mich bei einigen Projekten zu unterstützen, und ist mit jedem gewachsen.“
'-Implementierung. Derzeit verwende ich diese Klasse, um XML-Daten für Archivierungszwecke zu tarballen
', wodurch ich Hunderte dynamisch erstellter XML-Dateien in einem einzigen Download abrufen kann.
'
' Es gibt eine kleine Anzahl von Eigenschaften und Methoden, die im beschrieben werden
' Begleitdokumentation.
'
Klassen-Tarball
Public TarFilename ' Resultierender Tarball-Dateiname
Öffentliche Benutzer-ID ' UNIX-Benutzer-ID
Öffentlicher Benutzername ' UNIX-Benutzername
Öffentliche Gruppen-ID ' UNIX-Gruppen-ID
Public GroupName ' UNIX-Gruppenname
Öffentliche Berechtigungen ' UNIX-Berechtigungen
Public BlockSize ' Blockbytegröße für den Tarball (Standard = 512)
Public IgnorePaths ' Ignoriert alle angegebenen Pfade für die Tarball-Ausgabe
Public BasePath ' Fügen Sie mit jeder Datei einen Basispfad ein
Öffentlicher Weg
'Speicher für Dateiinformationen
Private objFiles,TmpFileName
Private objMemoryFiles
„Subs zur Dateilistenverwaltung, sehr einfache Dinge.“
Öffentliches Sub AddFile(sFilename)
objFiles.Add sFilename,sFilename
Sub beenden
Public Sub RemoveFile(sFilename)
objFiles.Remove sFilename
Sub beenden
Public Sub AddMemoryFile(sFilename,sContents)
objMemoryFiles.Add sFilename,sContents
Sub beenden
Öffentlicher Sub RemoveMemoryFile(sFilename)
objMemoryFiles.Remove sFilename
Sub beenden
' Senden Sie den Tarball an den Browser
Öffentlicher Sub WriteTar()
Dimmen Sie objStream, objInStream, lTemp, aFiles
Set objStream = Server.CreateObject(ADODB.Stream) ' Der Hauptstream
Set objInStream = Server.CreateObject(ADODB.Stream) ' Der Eingabestream für Daten
objStream.Type = 2
objStream.Charset = x-ansi ' Gutes altes erweitertes ASCII
objStream.Open
objInStream.Type = 2
objInStream.Charset = x-ansi
' Gehen Sie zunächst alle auf der Festplatte gespeicherten Dateien durch
aFiles = objFiles.Items
Für lTemp = 0 bis UBound(aFiles)
objInStream.Open
objInStream.LoadFromFile aFiles(lTemp)
objInStream.Position = 0
'ExportFile aFiles(lTemp),objStream,objInStream
TmpFileName =replace(aFiles(lTemp),Server.Mappath(Path)&/,)
ExportFile TmpFileName,objStream,objInStream
objInStream.Close
Nächste
„Fügen Sie jetzt Dinge aus dem Speicher hinzu.“
aFiles = objMemoryFiles.Keys
Für lTemp = 0 bis UBound(aFiles)
objInStream.Open
objInStream.WriteText objMemoryFiles.Item(aFiles(lTemp))
objInStream.Position = 0
ExportFile aFiles(lTemp),objStream,objInStream
objInStream.Close
Nächste
objStream.WriteText String(BlockSize,Chr(0))
„Spulen Sie den Stream zurück.“
' Denken Sie daran, den Typ wieder in Binär zu ändern, da sonst der Schreibvorgang abgeschnitten wird
' nach dem ersten Null-Byte-Zeichen.
objStream.Position = 0
objStream.Type = 1
' Stellen Sie alle Browser-Einstellungen ein
Response.AddHeader Content-Disposition,filename= & TarFilename
Response.ContentType = application/x-tar
Response.BinaryWrite objStream.Read
„Schließ es und geh nach Hause.“
objStream.Close
Setze objStream = Nothing
Setze objInStream = Nothing
Sub beenden
' Erstellen Sie für jede Datei einen Header und senden Sie den Dateiinhalt
Private Sub ExportFile(sFilename,objOutStream,objInStream)
Dimmen Sie lStart, lSum, lTemp
lStart = objOutStream.Position ' Zeichnen Sie auf, wo wir gerade sind
Wenn IgnorePaths, dann
' Wir ignorieren alle Pfade, die unseren Dateinamen vorangestellt sind
lTemp = InStrRev(sFilename,/)
wenn lTemp <> 0 dann
sFilename = Right(sFilename,Len(sFilename) - lTemp)
Ende wenn
sFilename = BasePath & sFilename
Ende wenn
' Erstellen Sie den Header, bis auf die Daten ist alles ASCII in Oktalform
objOutStream.WriteText Left(sFilename & String(100,Chr(0)),100)
objOutStream.WriteText 100 & Right(000 & Oct(Permissions),3) & & Chr(0) 'Dateimodus
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) 'size
objOutStream.WriteText Right(String(11,0) & Oct(dateDiff(s,1/1/1970 10:00,now())),11) & Chr(0) 'mtime (Anzahl der Sekunden seit 10 Uhr am 1. Januar 1970 (10 Uhr richtig?)
objOutStream.WriteText 0 & String(100,Chr(0)) 'chksum, geben Sie Flag und Linknamen ein, schreiben Sie alle Leerzeichen aus, damit die tatsächliche Prüfsumme korrekt berechnet wird
objOutStream.WriteText ustar & Chr(0) 'Magie und Version
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)) 'Präfix und Anführer
objInStream.CopyTo objOutStream ' Die Daten an den Stream senden
if (objInStream.Size Mod BlockSize) > 0 dann
objOutStream.WriteText String(BlockSize - (objInStream.Size Mod BlockSize),Chr(0)) 'Auffüllung bis zur nächsten Blockbyte-Grenze
Ende wenn
' Berechnen Sie die Prüfsumme für den Header
lSumme = 0
objOutStream.Position = lStart
Für lTemp = 1 bis BlockSize
lSum = lSum + (Asc(objOutStream.ReadText(1)) und &HFF&)
Nächste
„Fügen Sie es ein
objOutStream.Position = lStart + 148
objOutStream.WriteText Right(String(7,0) & Oct(lSum),7) & Chr(0)
' Gehen Sie zum Ende des Streams
objOutStream.Position = objOutStream.Size
Sub beenden
„Beginnen Sie alles
Private Sub Class_Initialize()
Setze objFiles = Server.CreateObject(Scripting.Dictionary)
Set objMemoryFiles = Server.CreateObject(Scripting.Dictionary)
Blockgröße = 512
Berechtigungen = 438 ' UNIX 666
Benutzer-ID = 0
Benutzername = root
Gruppen-ID = 0
Gruppenname = root
IgnorePaths = False
BasePath =
TarFilename = new.tar
Sub beenden
Private Sub Class_Terminate()
Setze objMemoryFiles = Nothing
Setze objFiles = Nothing
Sub beenden
Unterricht beenden
%>