Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/1: Рейтинг темы: голосов - 1, средняя оценка - 5.00
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,671
Записей в блоге: 2

Работа с zip архивами

29.10.2024, 02:49. Показов 22048. Ответов 283
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Из всего, что попадалось по теме сжатия/распаковки ZIP наиболее интересные были примеры с использованием библиотеки Zlib. Оригинальная zlib использует cdecl экспорт функций, но есть реализация zlibwapi.dll, которую можно использовать в VB. Вот хороший пример использования. Там можно увидеть как сжть/распаковать массив байтов, но вот беда, очень сложно найти пример под VB с более обширным использованием, способной на большее, данной либы, которая не есть простая, там есть функции с использованием множества параметров констант и длинных структур, которые чтобы узнать наверное надо долго копатся в сишных заголочниках. Но HackerVlad в личной беседе говорил, что у него есть исходники с использованием данной библиотеки, поэтому любезно прошу его поделиться данной информацией.

Добавлено через 1 минуту
кстати словосочетание zip-архивами в названии форум блочит почему-то )

Добавлено через 6 минут
На одном форуме есть хороший пример испльзования функций zlib для извлечения/распаковки отдельных файлов, там
Кликните здесь для просмотра всего текста
обсуждался какой-то экзотический ЯП Clarion, но очень наглядно
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
! Источнег: https://forum.clarionlife.net/viewtopic.php?t=2389
! Для добавления в архив PwlZip ваш пароль
ZipHandle = zipOpen(NEW_ZIPPACK, 0)
If EncryptFlag = 1
Res# = zipOpenNewFileInZip3(ZipHandle, PATH_CURZIP, Zinfo, 0, 0, 0, 0, Comment, Z_DEFLATED, CompressionFlag,0,-15,8,0,PwlZip,0)
Else
Res# = zipOpenNewFileInZip(ZipHandle, PATH_CURZIP, Zinfo, 0, 0, 0, 0, Comment, Z_DEFLATED, CompressionFlag)
.
 
!Для чтения из архива
ZipHandle = unzOpen(PATH_INFILE_PACK)
LocRes1=UnzGoToFirstFile(ZipHandle)
If unzGetCurrentFileInfo(ZipHandle,FinFo,PATH_NAMEUPD_TMP,Size(PATH_NAMEUPD_TMP),0,0,Comment,Size(Comment)).
If FinFo.Flag = 3 !признак шифрованного zip по крайней мере так я понял после мыкания с архивами
LocRes2 = unzOpenCurrentFilePassword(ZipHandle,PwlZip)
Else
LocRes2 = UnzOpenCurrentFile(ZipHandle)

Здесь подробное описание функций, структур и констант, однако я не нашел там unzGetCurrentFileInfo и т.п.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.10.2024, 02:49
Ответы с готовыми решениями:

Работа с ZIP-архивами - распаковка файлов
Привет, уважаемый ALL! Подскажите, как можно работать с zip архивами из VBA? Стоит задача: 1) прочитать из архива...

Автоматизировать заполнение "Графика выполненных работ по месяцам"
Используя готовую рабочую книгу Blank1.xls, автоматизировать заполнение "Графика выполненных работ по месяцам". Из диапазона дат в...

Задания из лаб.работ
Надоедаю наверное уже всем...

283
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
03.11.2024, 16:13
Студворк — интернет-сервис помощи студентам
testuser2, ансишную строку можно создать через присвоение из байтового массива по моему, или стабильно-точно через StrConv

Добавлено через 1 минуту
Зашивать реально по на самом деле в ресурсы ещё можно

Добавлено через 13 минут
Цитата Сообщение от testuser2 Посмотреть сообщение
там же надо собирать строку из частей
ты вручную собираешь строку из частей? или есть авто-скрипт какой-то у тебя для этого? и каким скриптом ты создавал строку b64?
0
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,671
Записей в блоге: 2
03.11.2024, 17:09  [ТС]
Цитата Сообщение от HackerVlad Посмотреть сообщение
и каким скриптом ты создавал строку b64?
Я сделал специальный макрос для этого

Добавлено через 5 минут
баз64 в вебе используется. На сайте planetaexcel еси вставить картинку из буфера в редактор, она автоматически преобразуется в base64 со спциальным заголовком. Потом можно этот баз64 вставить в строку браузера и он автоматически преобразует его в картинку

Добавлено через 7 минут
Преобразование файла в Base64_VBCode
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
Private Sub Example()
    Dim FlPt$: FlPt = "D:\tmp\Zip\Diletant\Simpler Zipper Demo_\zlibwapi.zip"
    FileToBase64VBCode FlPt
End Sub
Private Sub FileToBase64VBCode(FilePath As String) '    Длина файла zlibwapi.dll 126056
    Const lineDataLen& = 900
    Const lineMaxCount& = 16
    Const sbgn$ = "B64 = _" & vbLf & """"
    Const dlm1$ = """ & _" & vbLf & """"
    Const dlm2$ = """" & vbLf & "B64 = B64 & _" & vbLf & """"
    Dim i&, fNum&, FileName$, FileDir$, B64$, sBuf$
    Dim lineCount&, rowCount&, B64Len&, lineNum&, lineLen1&, lineLen2&, pos&
    Dim sbgnLen&:   sbgnLen = Len(sbgn)
    Dim dlm1Len&:   dlm1Len = Len(dlm1)
    Dim dlm2Len&:   dlm2Len = Len(dlm2)
    Dim difDlmLen&: difDlmLen = dlm2Len - dlm1Len
    
    pos = InStrRev(FilePath, "\")
    FileName = Mid$(FilePath, pos + 1)
    FileDir = Mid$(FilePath, 1, pos)
    B64 = FileToBase64(FilePath)
    
    B64Len = Len(B64)
    lineCount = (B64Len - 1) \ lineDataLen + 1
    rowCount = (lineCount - 1) \ lineMaxCount + 1
    sBuf = String(B64Len + dlm1Len * (lineCount - 1) + difDlmLen * (rowCount - 1) + sbgnLen + 1, vbNullChar)
    lineLen1 = lineDataLen + dlm1Len
    lineLen2 = lineDataLen + dlm2Len
    
    Mid$(sBuf, 1) = sbgn
    pos = sbgnLen + 1
    lineNum = 1
    For i = 1 To B64Len - lineDataLen Step lineDataLen
        If lineNum < lineMaxCount Then
            Mid$(sBuf, pos) = Mid$(B64, i, lineDataLen) & dlm1
            pos = pos + lineLen1
            lineNum = lineNum + 1
        Else
            Mid$(sBuf, pos) = Mid$(B64, i, lineDataLen) & dlm2
            pos = pos + lineLen2
            lineNum = 1
        End If
    Next
    Mid(sBuf, pos) = Mid(B64, i) & """"
    
    fNum = FreeFile
    Open FilePath & "_B64VB.txt" For Binary Access Write As fNum
    Put fNum, , sBuf
    Close fNum
End Sub
Private Function FileToBase64(FilePath As String) As String
    Dim fNum&, fLen&, bBuf() As Byte
    
    If Len(Dir(FilePath)) = 0 Then Exit Function
    
    fNum = FreeFile
    Open FilePath For Binary Access Read As fNum
    fLen = LOF(fNum)
    ReDim bBuf(fLen - 1)
    Get fNum, , bBuf
    Close fNum
    
    With CreateObject("MSXML2.DomDocument").createElement("b64")
        .DataType = "bin.base64"
        .nodeTypedValue = bBuf
        FileToBase64 = Replace(.text, vbLf, vbNullString)
    End With
End Function


Добавлено через 1 минуту
Цитата Сообщение от testuser2 Посмотреть сообщение
На сайте planetaexcel еси вставить картинку из буфера в редактор
cп**сдел, нет там такого (щас проверил), просто я видел, как другие так вставляют картинки

Добавлено через 38 минут
Еще идея появилась, как можно записать конкатенацию большого колличества строк. Правда не известно, есть ли ограничение у ParamArray
Visual Basic
1
2
3
4
5
6
7
8
Private Sub TestParamArray()
    Dim s$
    s = Join(Array( _
    "afdfasdfasd", _
    "333222erere", _
    "kljkjhjhewr" _
    ), vbNullString)
End Sub
1
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
03.11.2024, 17:50
Цитата Сообщение от testuser2 Посмотреть сообщение
Длина файла zlibwapi.dll 126056
А тут разве ты не cп**сдел? У меня длина твоего файла 171008 байт

Добавлено через 1 минуту
testuser2, ансишную строку так и не получилось у тебя создать?
0
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,671
Записей в блоге: 2
03.11.2024, 17:54  [ТС]
Цитата Сообщение от HackerVlad Посмотреть сообщение
А тут разве ты не cп**сдел?
Чистая правда
Code
1
2
?len(b64)
 126056
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
03.11.2024, 18:00
testuser2, как это может быть меньше чем размер самого фала? не понимаю
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
03.11.2024, 18:27
testuser2, у меня раньше была вообще старая технология, давно, 20 лет назад, с братом я писал программу, которая любой абсолютно файл превращает в модуль для создания этого файла. Программа эта у нас называлась All2Bas
Сейчас я для интереса посмотрел, созданный модуль (для создания DLL файла) занимает аж целых 2 мегабайта. Это вообще жесть. А сам EXE раздувается ажно до 6 мегабайт! Это просто жесть! Можешь посмотреть для интереса. Я и понятия не имел даже про base64.
Вложения
Тип файла: zip 2.zip (770.5 Кб, 8 просмотров)
1
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
03.11.2024, 18:41
А сам код собирания файла разбивается ажно на 68 разных процедур для этого файла... Из-за ограничений VB6 по объёму кода в одной процедуре...

Добавлено через 11 минут
testuser2, я не знал вообще про технологию base64, но на основе этой технологии можно тогда написать систему для проигрывания WAV-файла, не из ресурсов EXE-файла, а из закодированной строки base64 тогда получается.
0
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,671
Записей в блоге: 2
03.11.2024, 18:48  [ТС]
Я сжимал зип-сжатием с макс. уровнем компрессии, перед тем как преборазовать в баз64.
Здесь есть баз64 на чистом VB вроде

Добавлено через 4 минуты
Цитата Сообщение от HackerVlad Посмотреть сообщение
но на основе этой технологии можно тогда написать систему для проигрывания WAV-файла, не из ресурсов EXE-файла
Но недостаток ты уже понял - он хранится в юникоде, хотя мог бы храниться в ansi с той же плотностью информации. Интересно в Твин-бейсике поддерживаются ли разные кодировки

Добавлено через 2 минуты
вернее не плотностью а объемом, плотность была бы в 2 раза выше
1
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
03.11.2024, 18:54
Цитата Сообщение от testuser2 Посмотреть сообщение
он хранится в юникоде
ты же сам только что дал ссылку где это уже обсуждалось. вот: https://www.vbforums.com/showt... ost4845671
там они потом перекодируют в utf8 думаю можно так же и в ansi но в данном случае думаю что utf8 будет тоже самое что и ansi

Добавлено через 3 минуты
Либо смотри сделать обычной конвертацией если без API

Как там было сделано у человека вот
Visual Basic
1
2
3
4
5
6
7
8
9
Private Sub Command1_Click()
    'Convert payload to ANSI, then Base64 encode that:
    Text2.Text = CAPIUtilities.Base64Encode(StrConv(Text1.Text, vbFromUnicode))
End Sub
 
Private Sub Command2_Click()
    'Decode Base64, convert payload back to Unicode:
    Text3.Text = StrConv(CAPIUtilities.Base64Decode(Text2.Text), vbUnicode)
End Sub
Добавлено через 1 минуту
Хотя подожди сама фишка заключается в том что VB6 по умолчанию хранит строки в юникоде. Когда ты пишешь строка = содержимое. Значит ничего не изменить уже получается никакими API?
0
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,671
Записей в блоге: 2
03.11.2024, 19:00  [ТС]
Если 7zip с уровнем компрессии "ультра" сжать, то можно выиграть еще 20% в сравнении с zip

Добавлено через 3 минуты
Цитата Сообщение от HackerVlad Посмотреть сообщение
Хотя подожди сама фишка заключается в том что VB6 по умолчанию хранит строки в юникоде
Получается хранить много строк/данных в коде не очень удачная идея, лучше использовать ресурсы, как ты говорил, в общем-то для чего они наверное и предназначены.
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
03.11.2024, 19:01
testuser2, кстати хотел спросить, а версия zlibwapi.dll которую ты прикрепил это последняя версия 1.2.8
???
0
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,671
Записей в блоге: 2
03.11.2024, 19:01  [ТС]
Но для мелких файлов годится
1
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
03.11.2024, 19:07
testuser2, у меня вот версия 1.2.3 занимает всего 74 Кб, её более выгодно тогда использовать, почти на 100Кб меньше

Добавлено через 40 секунд
Хотя можно попробовать твою версию сжать UPX тогда будет меньше точно, сейчас попробую, в скорости там вряд ли проиграем

Добавлено через 1 минуту
testuser2, после сжатия упэиксом твоя библиотека стала занимать 89Кб

Добавлено через 55 секунд
testuser2, а моя, после сжатия, стала всего 43 Кб
0
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,671
Записей в блоге: 2
03.11.2024, 19:12  [ТС]
Цитата Сообщение от HackerVlad Посмотреть сообщение
последняя версия 1.2.8
Не знаю, скорее всего да, вроде бы здесь брал

Добавлено через 1 минуту
Цитата Сообщение от HackerVlad Посмотреть сообщение
у меня вот версия 1.2.3
Это в свойствах файла указано?
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
03.11.2024, 19:25
Цитата Сообщение от testuser2 Посмотреть сообщение
Это в свойствах файла указано?
Ну да, у меня вот есть версия 1.2.3 которую я изначально тут всегда прикладывал в своих примерах. Она весит всего 74240 байт без сжатия.

Добавлено через 29 секунд
Цитата Сообщение от testuser2 Посмотреть сообщение
вроде бы здесь брал
я там искал но так и не смог скачать

Добавлено через 1 минуту
testuser2, а если попробовать байтовому массиву присвоить строку? тоже самое будет в EXE-файле в юникоде в итоге? не пробовал? или так не получится?
Наверное любое содержимое внутри кода взятое в двойные ковычки будет кодироваться в юникоде?

Добавлено через 1 минуту
Но как строка base64 в итоге становится меньше по размеру чем сам файл я так и не понял этого чуда.

Добавлено через 2 минуты
Альтернатива только одна - зашивать в настоящие ресурсы EXE получается, плюс можно ещё сжать этот буфер функциями сжатия из ntdll.dll для того чтобы было меньше байт в итоге...

Добавлено через 3 минуты
Пока короче я за основу буду рать твой файл версии 1.2.8 без сжатия размером 171008 байт
0
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,671
Записей в блоге: 2
03.11.2024, 19:28  [ТС]
Цитата Сообщение от HackerVlad Посмотреть сообщение
Но как строка base64 в итоге становится меньше по размеру чем сам файл я так и не понял этого чуда.
Тож количество символов строки, но не байтовый размер. И файл я сжимал перед этим. Если не сжимать, то баз64 будет выглядет так
Кликните здесь для просмотра всего текста
Code
1
2
3
4
5
"w8AAAD/////AAAAAP////8PAAAA/////wAAAAD/////DwAAAP////8AAAAA/////w8AAACsAQAAgAAAAP////8PAAAALAIAABgAAAD/////DwAAAEQCAAAAAgAA/////w8AAABEBAAAd" & _
'    "AAAAP////8PAAAAuAQAAFAAAAD/////DwAAAAgFAAAIAAAA/////w8AAAD/////AAAAAP////8PAAAA/////wAAAAD/////DwAAAP////8AAAAA/////w8AAAD/////AAAAAP////8PA" & _
'    "AAA/////wAAAAD/////DwAAACIJAAAQBQAAAAAAAAAAAAADAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAAYAAAAAAAAACAAAAAAAAAAAAAAAP////8AAAAAAgAAAEQAA" & _
'    "AAAAAAAAAAAAP///////////////wAAAAD//////////////////////////////////////////////////////////////////////////////////////////////////////////" & _
'    "////////////////////////////////////////////////2h682Et+Y1FtQufxV28DgT+
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
03.11.2024, 19:34
Цитата Сообщение от testuser2 Посмотреть сообщение
я сжимал перед этим
а как ты сжимал строку base 64 я что-то не понимаю...
0
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,671
Записей в блоге: 2
03.11.2024, 19:38  [ТС]
Бвз64 не сжимал
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
03.11.2024, 19:52
В общем я сделал извлечение DLL-файла из ресурсов. EXE файл при этом откомпилированный занимает всего 192 Кб против 278 по технологии testuser2.
Вложения
Тип файла: zip zlibwapi.dll from resources v.1.zip (191.4 Кб, 5 просмотров)
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
03.11.2024, 20:05
Сейчас ещё сделаю вторую версию с компрессией буфера, с помощью API-функций из ntdll.dll там будет создание DLL файла из ресурсов из сжатого буфера и количество байт конечно будет очень уменьшено.

Добавлено через 2 минуты
Есть же великолепные функции RtlCompressBuffer и RtlDecompressBuffer их я и планирую использовать, чтобы уменьшить количество байт данных.

Добавлено через 4 минуты
Упакованный файл с помощью RtlCompressBuffer будет занимать уже 125047, не сильно сжало конечно...

Добавлено через 2 минуты
Но это лучше чем методом хафмана там 145 Кб где-то выходной буфер получался

Добавлено через 1 минуту
Но и хуже чем UPX если так подумать... Но упакованные DLL в UPX зато работают чуть медленнее поэтому не будем так упаковывать через UPX уже...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.11.2024, 20:05

access и zip архив
Привет всем! Подскажите... если есть возможность сохранение файла в zip архив Dim FileHeder As String Dim filePath As String ...

Как распаковать ZIP-файл в 7z?
'При помощи VBA WinRAR распаковывает архив в папку … q = Адрес_сохранения_файла 'путь к каталогу, то есть к папке, в конце пути для...

ребята!завтра надо сдать работу,а без этих работ никак((
алгоритмы линейной структуры 1) СОСТАВИТЬ ПРОГРАММУ ВЫЧИСЛЕНИЯ СРЕДНЕГО ЗНАЧЕНИЯ ТРЕХ ВЕЛИЧИН 2) ПОДСЧИТАТЬ И ВЫВЕСТИ НА ЭКРАН СУММУ И...

Замена файла в zip архиве при совпадении имени
Есть несколько excel файлов. например, 1.xls, 2.xls, 3.xls Есть куча zip архивов. например, A (1.xls), B (1.xls,5.doc,3.doc), C (3.xls),...

Как сделать архив zip?
Как сделать архив zip? Какие нужны библиотеки и где их взять? заранее спасибо.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Новые блоги и статьи
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru