Всем привет снова.
Может быть у кого то завалялись сорцы архиватора на VB?
HCompress не предлагать - мне надо заархивировать целую папку.
Chilikat ZIP триальный (а жаль).
Да, и ещё. Триальное и большое не предлагать плз )) покатит способ превращения папки в файл и обратно. Всё что угодно, лишь бы юзер не смог открыть обычным файл-менеджером файл.
WinRAR допускает управление из командной строки. Общий синтаксис командной строки таков:
WinRAR <команда> -<ключ1> -<ключN> <архив> <файлы…> <@файл-список…> <путь для извлечения\>
команда Комбинация символов, определяющая действие, которое будет выполнять WinRAR.
ключ Ключи используются для определения специфических действий, степени сжатия, типа архива и пр.
архив Имя обрабатываемого архива.
файлы Имена обрабатываемых файлов.
файл-список Файлы-списки - это обычные текстовые файлы, содержащие имена файлов для обработки. Каждое имя файла должно быть указано на отдельной строке и начинаться с первой позиции строки. В файл-список допускается помещать комментарии, признак начала комментария - символы //. Например, для архивирования файлов *.txt из папки c:\work\doc, файлов *.bmp из папки c:\work\image и всех файлов из папки c:\work\misc можно создать backup.lst, содержащий следующие строки:c:\work\doc\*.txt //резервная копия текстовc:\work\image\*.bmp //резервная копия рисунковc:\work\miscПосле этого для архивирования достаточно будет выполнить команду:winrar a backup @backup.lstВ одной командной строке разрешается указывать как обычные имена или группы файлов для обработки, так и файлы-списки. Если не указаны ни файлы, ни файлы-списки, то подразумевается шаблон *.* (т.е. WinRAR обработает все файлы).
путь для извлечения Используется только с командами e и x и указывает папку, в которую нужно извлекать файлы. Если эта папка не существует, то она будет создана.
Платный, да?
Ну тогда проще не упаковывать файлы, а просто XORить их содержимое.
Или, если всетаки надо чтобы файл был один, то в его начале хранить инфо о файлах (имя, смещение, размер[, CRC]). + Сами файлы
В свое время написал модуль для создания архива без компресии:
"Arc.bas":
VB_Name = "Arc"
Option Explicit
Const FAT_SIZE = 50902
Public FatExp() As String
Public Sub AddArc(ArcName As String, fa As String, Optional Alias As String)
Dim fa_size As Long
Dim file_nums As Integer
Dim fat() As String
Dim i As Integer
Dim sum_size As Long
Dim add_pos As Long
Dim buf As String
Dim p As Long
Dim up As Integer
Dim r As Long
'Определяем есть ли архив?
On Error GoTo 10
Open ArcName For Input As #1
GoTo 20
10 Close #1
NewArc (ArcName)
20 Close #1
'Читаем FAT
Open ArcName For Random As #1 Len = 100
Get #1, 2, buf
file_nums = Val(buf)
ReDim fat(file_nums, 2)
up = 0 'Add
For i = 1 To file_nums
Get #1, i * 2 - 1, fat(i, 1)
Get #1, i * 2, fat(i, 2)
If fat(i, 1) = fa Then up = i - 1 'Update
sum_size = sum_size + Val(fat(i, 2))
Next i
sum_size = sum_size - Val(fat(1, 2))
'Позиция первого байта нового файла в архиве
add_pos = FAT_SIZE + sum_size
If up <> 0 Then
'update
Close #1
'Extract files after fa
For i = up + 1 To file_nums
If fat(i, 1) <> fa Then r = ExtractArc(ArcName, fat(i, 1))
Next i
'set FILENUMS = up
Open ArcName For Random As #1 Len = 100
buf = str(up)
Put #1, 2, buf
Close #1
'move all without fa (рекурсия!)
For i = up + 1 To file_nums
AddArc ArcName, fat(i, 1)
If fat(i, 1) <> fa Then Kill fat(i, 1)
Next i
Else
'add
'Обновляем FAT
Open fa For Binary As #2
fa_size = LOF(2)
file_nums = file_nums + 1
buf = str(file_nums)
Put #1, 2, buf
If Alias <> "" Then
Put #1, file_nums * 2 - 1, Alias
Else
Put #1, file_nums * 2 - 1, fa
End If
buf = str(fa_size)
Put #1, file_nums * 2, buf
'Get #1, 4, buf
Close #1
'Дописываем
Open ArcName For Binary As #1
buf = String(fa_size, " "
'For p = 1 To fa_size
Get #2, 1, buf
Put #1, add_pos + 1, buf
'Next p
Close #1
Close #2
End If
End Sub
Public Function ListArc(ArcName As String) As Integer
Dim file_nums As Integer
Dim i As Integer
Dim buf As String
'Определяем есть ли файл?
On Error GoTo 10
Open ArcName For Input As #1
Close #1
GoTo 20
10 ListArc = 0
GoTo 30
20 'Читаем FAT
Open ArcName For Random As #1 Len = 100
Get #1, 2, buf
file_nums = Val(buf)
ReDim FatExp(file_nums - 1, 2)
For i = 2 To file_nums
Get #1, i * 2 - 1, FatExp(i - 1, 1)
Get #1, i * 2, FatExp(i - 1, 2)
Next i
Close #1
ListArc = file_nums - 1
30 End Function
Public Function ExtractArc(ArcName As String, fa As String) As Long
Dim fa_size As Long
Dim file_nums As Integer
Dim fat() As String
Dim i As Integer
Dim buf As String
Dim p As Long
Dim sum_size As Long
Dim add_pos As Long
'Определяем есть ли архив?
On Error GoTo 10
Open ArcName For Input As #1
GoTo 20
10 ExtractArc = 0
GoTo 200
20 Close #1
'Ищем запись о файле в FAT
Open ArcName For Random As #1 Len = 100
Get #1, 2, buf
file_nums = Val(buf)
ReDim fat(file_nums, 2)
sum_size = 0
For i = 1 To file_nums
Get #1, i * 2 - 1, fat(i, 1)
Get #1, i * 2, fat(i, 2)
If fat(i, 1) = fa Then GoTo 100
sum_size = sum_size + Val(fat(i, 2))
Next i
'Не нашли
ExtractArc = 0
Close #1
GoTo 200
'Нашли
100 sum_size = sum_size - Val(fat(1, 2))
Close #1
add_pos = FAT_SIZE + sum_size
'Extract
fa_size = Val(fat(i, 2))
On Error GoTo 250
Kill fa
250 Open ArcName For Binary As #1
Open fa For Binary As #2
buf = String(fa_size, " "
'For p = 1 To fa_size
Get #1, add_pos + 1, buf
Put #2, 1, buf
'Next p
Close #1
Close #2
ExtractArc = fa_size
200 End Function
Sub NewArc(ArcName As String)
Dim i As Integer
Open ArcName For Random As #1 Len = 100
Put #1, 1, "FILENUMS"
Put #1, 2, "1"
For i = 2 To 255
Put #1, i * 2 - 1, ""
Put #1, i * 2, ""
Next i
Close #1
End Sub
Public Function ExtractMem(ArcName As String, fa As String) As String
Dim fa_size As Long
Dim file_nums As Integer
Dim fat() As String
Dim i As Integer
Dim buf As String
Dim p As Long
Dim sum_size As Long
Dim add_pos As Long
'Определяем есть ли архив?
On Error GoTo 10
Open ArcName For Input As #1
GoTo 20
10 ExtractMem = ""
GoTo 200
20 Close #1
'Ищем запись о файле в FAT
Open ArcName For Random As #1 Len = 100
Get #1, 2, buf
file_nums = Val(buf)
ReDim fat(file_nums, 2)
sum_size = 0
For i = 1 To file_nums
Get #1, i * 2 - 1, fat(i, 1)
Get #1, i * 2, fat(i, 2)
If fat(i, 1) = fa Then GoTo 100
sum_size = sum_size + Val(fat(i, 2))
Next i
'Не нашли
ExtractMem = ""
Close #1
GoTo 200
'Нашли
100 sum_size = sum_size - Val(fat(1, 2))
Close #1
add_pos = FAT_SIZE + sum_size
'Extract
fa_size = Val(fat(i, 2))
On Error GoTo 250
250 Open ArcName For Binary As #1
buf = String(fa_size, " "
Get #1, add_pos + 1, buf
Close #1
ExtractMem = buf
200 End Function
Документация на модуль:
Модуль работы с псевдоархивом Arc.bas
Константы:
1. FAT_SIZE = 50902 – размер в байтах таблицы размещения файлов в псевдоархиве.
Функции:
1. Функция AddArc(ArcName As String, fa As String, Optional Alias As String)
Добавляет файл в псевдоархив. Если псевдоархив не существует, то он будет создан. Если файл с таким именем есть в псевдоархиве, то он будет замещен.
Входные параметры:
ArcName – имя файла псевдоархива.
fa – имя файла для добавления в псевдоархив.
Alias (необязательный параметр) – имя файла, которое будет записано в таблицу размещения файлов псевдоархива. Если отсутствует, то используется настоящее имя файла (fa).
2. Функция ListArc(ArcName As String) As Integer
Возвращает список файлов и их размер в псевдоархиве.
Входные параметры:
ArcName – имя файла псевдоархива.
Возвращает:
Количество файлов в псевдоархиве.
FatExp(n,2) As String – двумерный строковой массив размерности nx2. В первом столбце – имя файла, во втором – его размер в байтах.
3. Функция ExtractArc(ArcName As String, fa As String) As Long
Извлекает файл из псевдоархива.
Входные параметры:
ArcName – имя файла псевдоархива.
fa – имя файла для извлечения из псевдоархива.
Возвращает:
Размер извлеченного файла. Если псевдоархив или файл в псевдоархиве не существует, то возвращается 0.
4. Функция NewArc(ArcName As String)
Создает пустой псевдоархив.
Входные параметры:
ArcName – имя файла псевдоархива.
5. Функция ExtractMem(ArcName As String, fa As String) As String
Извлекает файл из псевдоархива в память.
Входные параметры:
ArcName – имя файла псевдоархива.
fa – имя файла для извлечения из псевдоархива.
Возвращает:
Содержимое извлеченного файла. Если псевдоархив или файл в псевдоархиве не существует, то возвращается пустая строка.
Структура псевдоархива
В модуле Arc.Bas описана константа FAT_SIZE = 50902 – размер в байтах таблицы размещения файлов в псевдоархиве.
Первые FAT_SIZE байт – заголовок (таблица размещения файлов в псевдоархиве). Структура таблицы – 255 полей по 100 байт. Первое поле - "FILENUMS", второе – количество файлов в псевдоархиве, начиная с 3: нечетные – имя файла, четные – размер файла в байтах. После таблицы (начиная с FAT_SIZE+1 байта) подряд идет содержимое файлов псевдоархива.
Структура полей формируются средствами языка VB 6.0 (метод Random работы с файлами).