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

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

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

Студворк — интернет-сервис помощи студентам
Из всего, что попадалось по теме сжатия/распаковки 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, автоматизировать заполнение "Графика выполненных работ по месяцам". Из диапазона дат в...

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

282
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
29.10.2024, 03:55
Тема конечно очень интересная, и есть много разных способов для работы с ZIP архивами и много разных библиотек для этого. Так же стоит отметить, что формат ZIP это свободно описанный и свободно документированный формат, можно даже и самому написать распаковщик, при желании, но потратить придётся конечно очень много времени, даже зная все описания структур и основной алгоритм, который свободно описан.

Я искал информацию в Интернете, для интереса и много чего находил, так же понимаю что бывает сложно найти что-то для себя, тем более на VB6.

Добавлено через 4 минуты
Итак предлагаемая тобой тема это как работать с архивами ZIP используя библиотеку zlibwapi.dll на VB6. Если мы сейчас будем рассматривать именно zlibwapi.dll то нужно знать сначала, что именно мы хотим от этой библиотеки. И нужно посмотреть а есть ли там вообще такая возможность как распаковка в байтовый массив, как ты хочешь.
1
1381 / 837 / 89
Регистрация: 08.02.2017
Сообщений: 3,501
Записей в блоге: 1
29.10.2024, 04:04  [ТС]
Архивация сложная тема, я находил тоже пример реализации сжатия Хоффмана, там довольно не просто все, похоже на шифрование причем символами переменной битовой длины. При чем там символы, которые попадаются статистически чаще в тексте должны кодироваться символами меньшей битовой длины. Это только Хоффман, а перед этим должно как-то сжиматься в лемпель зип и еще вопрос, как надо записывать структуру файлов в архиве. Короче сильно много вопросов )
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
29.10.2024, 04:07
Цитата Сообщение от testuser2 Посмотреть сообщение
я находил тоже пример реализации сжатия Хоффмана
Да это несложный алгоритм, всё довольно просто там, если есть готовые примеры, у меня есть тоже, но тебе же нужен именно ZIP?
0
1381 / 837 / 89
Регистрация: 08.02.2017
Сообщений: 3,501
Записей в блоге: 1
29.10.2024, 04:13  [ТС]
Пишу с телефона, потому без цитирования. Да именно zip, это самый популярный формат много где используется. Я смотрел экспорты zlibwapi там все есть, включая упомянутые функции, вопрос, только как из использовать
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
29.10.2024, 04:17
Вот здесь у меня в этой теме есть очень простой пример как упаковать и распаковать буфер на лету Функция RtlDecompressBuffer иногда обманывает и возвращает ложный успех вместо алгоритма Хафмана можно просто использовать функции RtlCompressBuffer и RtlDecompressBuffer . Но я не знаю почему тебе нужен именно ZIP.
2
1381 / 837 / 89
Регистрация: 08.02.2017
Сообщений: 3,501
Записей в блоге: 1
29.10.2024, 04:20  [ТС]
Я больше ни че не хочу только ZIP )
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
29.10.2024, 04:23
Здесь есть у меня пример по работе с библиотекой zlibwapi.dll на VB6. Но там по моему только упаковка, надо посмотреть ещё будет. Зато есть все объявления и структуры.
Вложения
Тип файла: zip Simpler Zipper Demo.zip (80.0 Кб, 6 просмотров)
3
1381 / 837 / 89
Регистрация: 08.02.2017
Сообщений: 3,501
Записей в блоге: 1
29.10.2024, 04:27  [ТС]
HackerVlad, спасибо, посмотрю как буду у компа.

Добавлено через 2 минуты
Интересно RtlCompressBuffer какой алгоритм использует, наврное один из видов zip
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
29.10.2024, 04:39
Цитата Сообщение от testuser2 Посмотреть сообщение
какой алгоритм использует, наврное один из видов zip
Нет, ZIP использует алгоритм Deflate, там используется какой-то свой майкрософтовский алгоритм LZ компрессор. COMPRESSION_FORMAT_LZNT1 единственно рабочий формат компрессии. Хоть есть и другие по описанию в MSDN: https://learn.microsoft.com/en... ressbuffer но на самом деле по факту работает только флаг COMPRESSION_FORMAT_LZNT1 я это точно помню.
2
1381 / 837 / 89
Регистрация: 08.02.2017
Сообщений: 3,501
Записей в блоге: 1
29.10.2024, 04:39  [ТС]
А понял COMPRESSION_FORMAT_LZNT1
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
29.10.2024, 04:57
Я иногда жалел кстати о том, что в Microsoft'е не сделали встроенных API-функций для ZIP чтобы встроенная уже DLL-библиотека была в Windows. Или в том же самом ntdll.dll можно было бы и добавить функций для компрессии и декомпресии буфера ZIP. Но они не захотели. Хотя shell32 же как-то всё же работает с ZIP...

Добавлено через 10 минут
Кстати вот же пример на иностранном форуме для работы с твоей библиотекой: https://www.vbforums.com/showt... odZlib-bas
Скорее всего тебе просто нужно воспользоваться функцией GzipDecompress
1
1381 / 837 / 89
Регистрация: 08.02.2017
Сообщений: 3,501
Записей в блоге: 1
29.10.2024, 05:06  [ТС]
Там есть своя зип-либа, только реализована она как-то по буржуйски. Но я видел пример у fafalone, с испоизованием специальной tlb

Добавлено через 5 минут
GzipDecompress там только исп-ся compress/uncompress, но тоже интересно, если нужен именно gzip
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
29.10.2024, 06:20
Твоя задача какая вообще? Распаковать ZIP архив в байтовый массив? Это подразумевает что в ZIP будет только один файл?

Добавлено через 58 минут
Я нашёл класс написанный на VB6 с нуля для полного управления ZIP архивами фактически исходный код любой библиотеки для работы с ZIP только ещё круче, там 3 тысячи строк кода, но вся эта гениальность полностью исключает зависимости от каких либо DLL мало того этот чувак распространяет свои труды свободно как есть (бесплатно).

Добавлено через 13 минут
Вот он этот гений, все права принадлежат ему если что https://github.com/wqweto там же на ГитХабе и все его труды. Всё о чём ты мечтал там есть.
2
1381 / 837 / 89
Регистрация: 08.02.2017
Сообщений: 3,501
Записей в блоге: 1
29.10.2024, 06:26  [ТС]
Я знаю про этого крутого болгарского чувака, который написал zip класс на vb. )
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
29.10.2024, 06:52
Лучший ответ Сообщение было отмечено testuser2 как решение

Решение

И я проверил - его код работает. Абсолютно гениальный код конечно.

Потом просто пишешь например так я проверил работает:

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
Private Sub Command10_Click()
    Dim dblTimer        As Double
    Dim bResult         As Boolean
    Dim sLastError      As String
    Dim baOutput()      As Byte
 
    dblTimer = Timer
    Set m_oZip = New cZipArchive
    m_bCancel = False
        
    With m_oZip
        .OpenArchive ReadBinaryFile("D:\TEMP\123 test.zip")
        bResult = .Extract(baOutput, 0)
        
        MsgBox UBound(baOutput) ' В байтовом массиве теперь есть содержимое первого файла внутри архива ZIP
        
        sLastError = .LastError
        labProgress.Caption = IIf(bResult, "Done. ", sLastError & ". ") & Format(Timer - dblTimer, "0.000") & " elapsed"
        dblTimer = Timer
        Debug.Print "Size=" & UBound(baOutput) + 1 & ", CRC32=0x" & Hex$(.CalcCrc32Array(baOutput)) & ", Elapsed=" & Format$(Timer - dblTimer, "0.000")
    End With
    Set m_oZip = Nothing
End Sub
И этот код будет считывать то что находится внутри архива D:\TEMP\123 test.zip первый файл и считывать его в байтовый массив. Всё! Никаких DLL!!! Главное скачай его класс с ГитХаба. Просто Бог в программировании подарил нам такое чудо конечно.

Добавлено через 6 минут
Ну вот и всё. Зачем тогда мучиться с библиотекой zlibwapi.dll если в интернете нету примеров для распаковки ZIP-файлов этой библиотекой? Есть пример только упаковки почему-то файлов. А примера распаковки нет. Про zlibwapi.dll можно забыть тогда я считаю, раз есть этот класс от супер-гения где не нужны никакие зависимости.
1
1381 / 837 / 89
Регистрация: 08.02.2017
Сообщений: 3,501
Записей в блоге: 1
29.10.2024, 07:37  [ТС]
Цитата Сообщение от HackerVlad Посмотреть сообщение
Зачем тогда мучиться с библиотекой zlibwapi.dll если в интернете нету примеров для распаковки ZIP-файлов этой библиотекой?
Почему же, тот файл, который ты выкладывал Simpler Zipper Demo очень даже интересный. Я нашел страницу автора, смешно, то что она уже была у меня в закладках. https://www.vbforums.com/showthread.php?720251
Я, кстати не знал, что у wqweto можно считывать в байтовый массив.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
29.10.2024, 15:49
Цитата Сообщение от testuser2 Посмотреть сообщение
Я, кстати не знал, что у wqweto можно считывать в байтовый массив
У него это написано в документации сразу в readme там в конце файла я вычитал что его класс прекрасно работает с байтовыми массивами в оперативной памяти.

Добавлено через 2 минуты
Цитата Сообщение от testuser2 Посмотреть сообщение
смешно, то что она уже была у меня в закладках
Я им задал вопрос про распаковку ZIP пока никто не ответил. Если честно меня это удвивляет зачем было писать упаковку но при этом не написать распаковку. И за 10 лет никто не возникал даже на эту тему.

Добавлено через 3 минуты
Можно перелапатить весь вбфорумс и киберфорум и не найти ответа вообще про распаковку ZIP.
0
1381 / 837 / 89
Регистрация: 08.02.2017
Сообщений: 3,501
Записей в блоге: 1
29.10.2024, 16:48  [ТС]
Цитата Сообщение от HackerVlad Посмотреть сообщение
Можно перелапатить весь вбфорумс
Думаю может быть все проще. Сама процедура упаковки реализуется за счет 3х функций zipOpen, zipOpenNewFileInZip и zipWriteInFileInZip
Чтение, думаю, должно быть таким: unzOpen, UnzOpenCurrentFile, unzReadCurrentFile
Code
1
2
3
4
5
6
https://docs.sodaware.net/blitz.zipapi/function.zlibwapi_unzreadcurrentfile.htm
Function ZlibWapi_UnzReadCurrentFile% (
     zipHandle%,
     buffer*%,
     bufferLength%
)
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
29.10.2024, 17:14
Лучший ответ Сообщение было отмечено testuser2 как решение

Решение

testuser2, кажется мне уже дали ответ на иностранном форуме: https://www.vbforums.com/showt... ibwapi-dll

Добавлено через 2 минуты
Надо будет посмотреть что там за класс у них, но я вижу что они не используют почему-то описанную тобой последовательность функций там просто Uncompress скорее всего... Странно, надо будет посмотреть...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.10.2024, 17:14
Помогаю со студенческими работами здесь

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? Какие нужны библиотеки и где их взять? заранее спасибо.


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru