Очень хороший код asp. Этот метод не рекомендуется для сжатия больших файлов. Легко сжать несколько маленьких файлов.
<%@ Language=VBScript %>
<% Опция явная %>
<!--#include file=asptar.asp-->
<%
Response.Buffer = Истина
Ответ.Очистить
Dim Co, Temp, T, x, i, fsoBrowse, theFolder, TheSubFolders, FilePath, s, PH, objTar
Со=0
PH=./UpFile «Путь к файлу» сжимает все файлы в Upfile.
Установить objTar = Новый архив
objTar.TarFilename=LvBBS_UpdateFile.rar 'Имя упаковки
objTar.Path=PH
установите fsoBrowse=CreateObject(Scripting.FileSystemObject)
Установите theFolder=fsoBrowse.GetFolder(Server.Mappath(PH))
Установите theSubFolders=theFolder.SubFolders
Для каждого T в папке.Files
Temp= Temp & T.Name & |
Со=Со+1
Следующий
Для каждого x в подпапках
Для каждого i в X.Files
Temp= Temp & X.Name&/&i.Name&|
Со=Со+1
Следующий
Следующий
Если Со<1 Тогда
Response.Write В настоящее время нет обновляемого файла для загрузки.
'objTar.AddMemoryFile Извините.txt, а не файл!
Еще
Температура=Влево(Темп,Длин(Темп)-1)
FilePath=Split(Темп,|)
Для s=0 в Ubound(FilePath)
objTar.AddFile Server.Mappath(PH&/&FilePath(s))
Следующий
Если Response.IsClientConnected Тогда
objTar.WriteTar
Ответ.Flush
Конец, если
Конец, если
Установить ObjTar = Ничего
Установить fsoBrowse= Ничего
Установить папку = Ничего
Установите Подпапки = Ничего
%>
asptar.asp
<%
' Создатель UNIX Tarball
' ====================
Автор: Крис Рид
' Версия: 1.0.1
' ====================
'
' Этот класс предоставляет возможность архивировать несколько файлов в один
' распространяемый файл, называемый tarball (TAR на самом деле означает Tape ARchive).
' Это обычные файлы UNIX, содержащие несжатые данные.
'
' Так чем же это полезно? Ну, это позволяет эффективно комбинировать несколько
' файлы в один файл для загрузки. Файлы TAR доступны для чтения и извлечения.
' с помощью самых разных инструментов, включая широко распространенный WinZip.
'
' Этот скрипт может включать в каждый архив два типа данных: данные файла, считанные с диска,
', а также прямо из памяти, например, из строки. Архивы поддерживают файлы.
' двоичная структура, поэтому при необходимости вы можете хранить исполняемые файлы или просто хранить
'текст.
'
' Этот класс был разработан, чтобы помочь мне в нескольких проектах, и с каждым разом он расширялся.
' В настоящее время я использую этот класс для архивирования XML-данных в целях архивирования.
', что позволяет мне получить сотни динамически созданных XML-файлов за одну загрузку.
'
' Существует небольшое количество свойств и методов, которые описаны в
' сопроводительная документация.
'
Класс Тарбол
Public TarFilename ' Результирующее имя файла tarball
Public UserID ' Идентификатор пользователя UNIX
Public UserName 'имя пользователя UNIX
Public GroupID ' Идентификатор группы UNIX
Public GroupName 'имя группы UNIX
Публичные разрешения 'Разрешения UNIX
Public BlockSize ' Размер блока в байтах для архива (по умолчанию = 512)
Public IgnorePaths ' Игнорировать любые предоставленные пути для вывода tar-архива.
Public BasePath ' Вставляет базовый путь к каждому файлу
Публичный путь
'Хранилище файловой информации
Частные objFiles, TmpFileName
Частный объект objMemoryFiles
'Подсистемы управления списком файлов, очень простые вещи
Публичный дополнительный файл AddFile (sFilename)
objFiles.Добавить имя_файла,имя_файла
Конец субтитра
Публичный дополнительный файл RemoveFile(sFilename)
objFiles.Remove sFilename
Конец субтитра
Публичная подпрограмма AddMemoryFile(sFilename,sContents)
objMemoryFiles.Добавить имя_файла,sContents
Конец субтитра
Публичная подпрограмма RemoveMemoryFile(sFilename)
objMemoryFiles.Remove sFilename
Конец субтитра
' Отправляем архив в браузер
Публичная подписка WriteTar()
Тусклый 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
'ExportFile aFiles(lTemp),objStream,objInStream
TmpFileName = replace(aFiles(lTemp),Server.Mappath(Путь)&/,)
ExportFile TmpFileName,objStream,objInStream
objInStream.Close
Следующий
'Теперь добавим что-нибудь из памяти
aFiles = objMemoryFiles.Keys
Для lTemp = 0 до UBound(aFiles)
objInStream.Open
objInStream.WriteText objMemoryFiles.Item(aFiles(lTemp))
objInStream.Position = 0
ExportFile 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 = приложение/x-tar
Response.BinaryWrite objStream.Read
'Закрой его и иди домой
objStream.Close
Установить objStream = Ничего
Установить objInStream = Ничего
Конец субтитра
' Создаем заголовок для каждого файла и отправляем содержимое файла
Частный дополнительный файл экспорта (sFilename, objOutStream, objInStream)
Тусклый lStart, lSum, lTemp
lStart = objOutStream.Position ' Записываем, где мы находимся
Если ИгнорироватьПути Тогда
' Мы игнорируем любые пути, предшествующие именам наших файлов.
lTemp = InStrRev(sFilename,/)
если lTemp <> 0, то
sFilename = Right(sFilename,Len(sFilename) - lTemp)
конец, если
имя_файла = базовый путь и имя_файла
Конец, если
' Создаем заголовок, все в восьмеричном формате 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 утра на 1 января 1970 года (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 'Отправляем данные в поток
если (objInStream.Size Mod BlockSize) > 0, то
objOutStream.WriteText String(BlockSize - (objInStream.Size Mod BlockSize),Chr(0)) 'Заполнение до ближайшей границы блочного байта
конец, если
' Вычисляем контрольную сумму заголовка
лСумма = 0
objOutStream.Position = lStart
Для lTemp = 1 To 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
Идентификатор пользователя = 0
Имя пользователя = root
ИД группы = 0
Имя группы = корень
ИгнорПатс = Ложь
БазовыйПуть =
TarFilename = новый.tar
Конец субтитра
Частный подкласс_Terminate()
Установить objMemoryFiles = Ничего
Установить objFiles = Ничего
Конец субтитра
Конечный класс
%>