Código asp muito bom. Este método não é recomendado para compactação. Para arquivos grandes, é fácil compactar alguns arquivos pequenos.
<%@Idioma=VBScript%>
<% Opção Explícita %>
<!--#include arquivo=asptar.asp-->
<%
Resposta.Buffer = Verdadeiro
Resposta.Limpar
Dim Co,Temp,T,x,i,fsoBrowse,theFolder,TheSubFolders,FilePath,s,PH,objTar
Co=0
PH=./UpFile 'Caminho do arquivo' compacta todos os arquivos em Upfile
Definir objTar = Novo Tarball
objTar.TarFilename=LvBBS_UpdateFile.rar 'Nome do pacote
objTar.Path=PH
definir fsoBrowse=CreateObject(Scripting.FileSystemObject)
Defina theFolder=fsoBrowse.GetFolder(Server.Mappath(PH))
Defina theSubFolders=theFolder.SubFolders
Para cada T em theFolder.Files
Temp= Temp & T.Nome & |
Co=Co+1
Próximo
Para cada x nas subpastas
Para cada i em X.Files
Temp= Temp & X.Nome&/&i.Nome&|
Co=Co+1
Próximo
Próximo
Se Co<1 então
Response.Write Atualmente não há nenhum arquivo atualizável para download.
'objTar.AddMemoryFile Desculpe.txt, não arquivo!
Outro
Temp=Esquerda(Temp,Len(Temp)-1)
FilePath=Dividir(Temp,|)
Para s = 0 para Ubound (FilePath)
objTar.AddFile Server.Mappath(PH&/&FilePath(s))
Próximo
Se Response.IsClientConnected então
objTar.WriteTar
Resposta.Flush
Terminar se
Terminar se
Definir ObjTar = Nada
Definir fsoBrowse = Nada
Defina theFolder = Nada
Defina theSubFolders = Nada
%>
asptar.asp
<%
' Criador do UNIX Tarball
'====================
' Autor: Chris Read
' Versão: 1.0.1
' ====================
'
'Esta classe fornece a capacidade de arquivar vários arquivos juntos em um único
'arquivo distribuível chamado tarball (o TAR na verdade significa Tape ARchive).
'Estes são arquivos UNIX comuns que contêm dados não compactados.
'
' Então, para que isso é útil? Bem, ele permite que você combine vários de maneira eficaz?
' arquivos em um único arquivo para download. Os arquivos TAR são legíveis e extraíveis.
' por uma ampla variedade de ferramentas, incluindo o WinZip amplamente distribuído.
'
'Este script pode incluir dois tipos de dados em cada arquivo, dados de arquivo lidos de um disco,
' e também coisas diretas da memória, como de uma string. Os arquivos suportam arquivos em.
'uma estrutura binária, para que você possa armazenar arquivos executáveis se precisar, ou apenas armazenar
' texto.
'
'Esta classe foi desenvolvida para me auxiliar em alguns projetos e tem crescido a cada
' Implementação Atualmente eu uso esta classe para tarball dados XML para fins de arquivamento.
', o que me permite obter centenas de arquivos XML criados dinamicamente em um único download.
'
'Há um pequeno número de propriedades e métodos, que são descritos no
'documentação que acompanha.
'
Classe Tarball
Public TarFilename ' Nome do arquivo tarball resultante
UserID público 'ID do usuário UNIX
Nome de usuário público 'Nome de usuário UNIX
GroupID público 'ID do grupo UNIX
Public GroupName ' Nome do grupo UNIX
Permissões públicas ' Permissões UNIX
Public BlockSize ' Tamanho do byte do bloco para o tarball (padrão=512)
Public IgnorePaths ' Ignora quaisquer caminhos fornecidos para a saída do tarball
Public BasePath 'Insere um caminho base com cada arquivo
Caminho público
'Armazenamento de informações de arquivo
ObjFiles privados,TmpFileName
ObjMemoryFiles privados
'Subs de gerenciamento de lista de arquivos, coisas muito básicas
Sub AddFile público (sFilename)
objFiles.Adicionar sFilename,sFilename
Finalizar sub
Sub RemoveFile público (sFilename)
objFiles.Remove sFilename
Finalizar sub
Public Sub AddMemoryFile(sFilename,sContents)
objMemoryFiles.Add sFilename,sContents
Finalizar sub
Sub público RemoveMemoryFile(sFilename)
objMemoryFiles.Remove sFilename
Finalizar sub
' Envia o tarball para o navegador
Sub WriteTar público()
Dim objStream, objInStream, lTemp, aFiles
Set objStream = Server.CreateObject(ADODB.Stream) 'O fluxo principal
Set objInStream = Server.CreateObject(ADODB.Stream) 'O fluxo de entrada para dados
objStream.Type = 2
objStream.Charset = x-ansi ' Bom e velho ASCII estendido
objStream.Open
objInStream.Type = 2
objInStream.Charset = x-ansi
'Examina primeiro todos os arquivos armazenados no disco
aArquivos = objArquivos.Items
Para lTemp = 0 para UBound (aFiles)
objInStream.Open
objInStream.LoadFromFile aFiles(lTemp)
objInStream.Position = 0
'ExportFile aFiles(lTemp),objStream,objInStream
TmpFileName =replace(aFiles(lTemp),Server.Mappath(Path)&/,)
Arquivo de exportação TmpFileName,objStream,objInStream
objInStream.Fechar
Próximo
'Agora adicione coisas da memória
aFiles = objMemoryFiles.Keys
Para lTemp = 0 para UBound (aFiles)
objInStream.Open
objInStream.WriteText objMemoryFiles.Item(aFiles(lTemp))
objInStream.Position = 0
Arquivo de exportação aFiles(lTemp),objStream,objInStream
objInStream.Fechar
Próximo
objStream.WriteText String(BlockSize,Chr(0))
'Retroceder o fluxo
'Lembre-se de alterar o tipo de volta para binário, caso contrário a gravação será truncada
' após o primeiro caractere de byte zero.
objStream.Position = 0
objStream.Type = 1
'Configura todas as coisas do navegador
Response.AddHeader Content-Disposition,filename= & TarFilename
Response.ContentType = aplicativo/x-tar
Response.BinaryWrite objStream.Read
'Feche e vá para casa
objStream.Fechar
Definir objStream = Nada
Definir objInStream = Nada
Finalizar sub
'Constrói um cabeçalho para cada arquivo e envia o conteúdo do arquivo
Arquivo de subexportação privado (sFilename, objOutStream, objInStream)
Dim lStart, lSum, lTemp
lStart = objOutStream.Position ' Registra onde estamos
Se IgnorePaths então
' Ignoramos quaisquer caminhos prefixados aos nossos nomes de arquivos
lTemp = InStrRev(sNomeArquivo,/)
se lTemp <> 0 então
sFilename = Right(sFilename,Len(sFilename) - lTemp)
terminar se
sFilename = BasePath & sFilename
Terminar se
'Constrói o cabeçalho, tudo é ASCII em octal exceto os dados
objOutStream.WriteText Left(sFilename & String(100,Chr(0)),100)
objOutStream.WriteText 100 & Right(000 & Oct(Permissions),3) & & Chr(0) 'Modo de arquivo
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) 'tamanho
objOutStream.WriteText Right(String(11,0) & Oct(dateDiff(s,1/1/1970 10:00,now())),11) & Chr(0) 'mtime (Número de segundos desde as 10h no 1º de janeiro de 1970 (10h, correto?)
objOutStream.WriteText 0 & String(100,Chr(0)) 'chksum, digite flag e nome do link, escreva todos os espaços em branco para que a soma de verificação real seja calculada corretamente
objOutStream.WriteText ustar & Chr(0) 'mágica e versão
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)) 'prefixo e líder
objInStream.CopyTo objOutStream 'Envia os dados para o stream
if (objInStream.Size Mod BlockSize) > 0 então
objOutStream.WriteText String(BlockSize - (objInStream.Size Mod BlockSize),Chr(0)) 'Preenchimento até o limite de bytes do bloco mais próximo
terminar se
'Calcula o checksum do cabeçalho
lSoma = 0
objOutStream.Position = lStart
Para lTemp = 1 para BlockSize
lSum = lSum + (Asc(objOutStream.ReadText(1)) E &HFF&)
Próximo
'Insira
objOutStream.Position = lStart + 148
objOutStream.WriteText Right(String(7,0) & Oct(lSum),7) & Chr(0)
'Vai para o final do stream
objOutStream.Position = objOutStream.Size
Finalizar sub
'Comece tudo
Subclasse Privada_Initialize()
Definir objFiles = Server.CreateObject(Scripting.Dictionary)
Definir objMemoryFiles = Server.CreateObject(Scripting.Dictionary)
Tamanho do bloco = 512
Permissões = 438 ' UNIX 666
ID do usuário = 0
Nome de usuário = root
ID do grupo = 0
NomeGrupo = raiz
IgnorePaths = Falso
CaminhoBase =
TarFilename = novo.tar
Finalizar sub
Subclasse Privada_Terminate()
Definir objMemoryFiles = Nada
Definir objFiles = Nada
Finalizar sub
Fim da aula
%>