Работа с zip архивами29.10.2024, 02:49. Показов 22091. Ответов 283
Метки нет (Все метки)
Из всего, что попадалось по теме сжатия/распаковки ZIP наиболее интересные были примеры с использованием библиотеки Zlib. Оригинальная zlib использует cdecl экспорт функций, но есть реализация zlibwapi.dll, которую можно использовать в VB. Вот хороший пример использования. Там можно увидеть как сжть/распаковать массив байтов, но вот беда, очень сложно найти пример под VB с более обширным использованием, способной на большее, данной либы, которая не есть простая, там есть функции с использованием множества параметров констант и длинных структур, которые чтобы узнать наверное надо долго копатся в сишных заголочниках. Но HackerVlad в личной беседе говорил, что у него есть исходники с использованием данной библиотеки, поэтому любезно прошу его поделиться данной информацией.
Добавлено через 1 минуту кстати словосочетание zip-архивами в названии форум блочит почему-то )Добавлено через 6 минут На одном форуме есть хороший пример испльзования функций zlib для извлечения/распаковки отдельных файлов, там Кликните здесь для просмотра всего текста
обсуждался какой-то экзотический ЯП Clarion, но очень наглядно
Здесь подробное описание функций, структур и констант, однако я не нашел там unzGetCurrentFileInfo и т.п.
0
|
||||||
| 29.10.2024, 02:49 | |
|
Ответы с готовыми решениями:
283
Работа с ZIP-архивами - распаковка файлов Автоматизировать заполнение "Графика выполненных работ по месяцам" Задания из лаб.работ |
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|
| 05.11.2024, 18:31 | |
|
testuser2, скорее всего существует жёсткое ограничение, например 30 там мегабайт или сколько, но я нашёл флаг DELTA_FLAG_IGNORE_OPTIONS_SIZE_LIMIT (Разрешить буферу параметров или файлам превышать ограничение по размеру по умолчанию.) может его попробовать
Добавлено через 36 секунд То есть существует "ограничение по размеру по умолчанию" понимаешь Добавлено через 11 минут Давай попробуем? DELTA_FLAG_IGNORE_OPTIONS_SIZE_LIMIT = (0x00040000)
1
|
|
| 05.11.2024, 18:41 [ТС] | |||||||||||||||||
|
Да флаг сработал
Private Const DELTA_FLAG_IGNORE_FILE_SIZE_LIMIT@ = 131072 / 10000 '&H20000Вызов функции:
Добавлено через 3 минуты
1
|
|||||||||||||||||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|
| 05.11.2024, 18:41 | |
|
Флаг-то сработал, я верно угадал значит, прочитав документацию, но вот скорость разочаровала
Упаковка 40 Мб: 23 секунды! жесть как медленно! Зато на выходе получилось всего 2 Мб! Сжало аж в 20 раз! Распаковка обратно занимает 312 млск терпимо ещё кстати.
0
|
|
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|||||||
| 05.11.2024, 21:48 | |||||||
|
testuser2, лучше чем CAB значит? а по скоростям что у тебя? отвратительно медленно сжимает тоже?
ну главное хотябы чтобы распаковка была более-ни-менее быстрой... Добавлено через 59 минут testuser2, у тебя кстати грамотическая ошибка в слове "Разкомментировать" правописание приставки рас, раз забыл из школьной программы что ли, рас пишется с глухими, раз с звонкими Добавлено через 15 минут Из документации: Функция DeltaFree Освобождает указанный блок памяти. Эту функцию необходимо вызвать после успешных вызовов CreateDeltaB и ApplyDeltaB , чтобы освободить буфер памяти, выделенный MSDelta. Добавлено через 5 минут testuser2, навёл красоту, вот окончательный вариант модуля:
testuser2, выложил все труды в готовых решениях: Готовые решения и полезные коды на Visual Basic 6.0 Добавлено через 55 минут testuser2, пытался сделать программу сейчас для извлечения из ресурсов буфера и распаковки для создания DLL но почему-то не работает, в IDE работает через F5 а вот в EXE не работает, ничего не могу понять, в полном шоке вообще, когда другая моя EXE работает прекрасно, это очень странно. Выскакивает ошибка 13. Что значит 13 ошибка, ты смотрел коды ошибок? В EXE только что самое смешное идёт Err.LastDllError будет 13 ничего не понимаю пока
1
|
|||||||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|
| 06.11.2024, 01:00 | |
|
Было очень сложно конечно разбираться с моей ошибкой этой, особенно когда работало в IDE но не работало в EXE (ненавижу такие чудеса, сложно понять что к чему) технология моя неправильная короче. Буду переделывать модуль.
Добавлено через 8 минут Какой-то глюк с ресурсами есть в VB6 Добавлено через 2 минуты Так что может моя технология и правильная а вот что там за баг с ресурсами в VB6 это уже другое Добавлено через 5 минут Я вспомнил, мне и The Trick говорил, что в VB6 есть баг при компиляции EXE связанный с ресурсами там в конце ресурсов иногда почему пару байт каки-то зачем-то добавляется Добавлено через 38 секунд Зато я наконец-то понял почему у меня не работает в EXE, но работает в IDE VB6 Добавлено через 9 минут По моему The Trick даже говорил, что нужно поставить SP6 тогда там этот глюк исправлен, а у меня SP5 стоит Добавлено через 1 минуту Суть в том что VB6 SP5 получается иногда изменяет данные в ресурсах в EXE - добавляет в конец лишние байты, это может быть один или два байта, или три или четыре лишних байта, это очень странно но это баг VB6 а не мой баг, а я целый час голову ломал думая почему у меня не работает мой модуль. Добавлено через 1 минуту Решение тут только одно буду отсекать лишние байты на конце, раз VB6 не умеет нормально компилировать EXE с ресурсами. Добавлено через 57 минут В моём проекте под названием "zlibwapi.dll from resources v.2" там тоже создан EXE с лишним одним байтом на конце, самое смешное, что там мы успешно скормили этот буфер NT-функциям и всё нормально было, функция RtlDecompressBuffer успешно схавала немного неправильный буфер (с лишним одним байтом на конце) и успешно вернуло идеально-правильный буфер, что самое смешное. А вот с дельта-функциями такое уже не пройдёт. Там требует идеально-правильный буфер изначально, иначе ошибка номер 13. Добавлено через 1 час 0 минут Ещё меня очень сильно удивило, что если создавать сжатые буфера из одного и того же файла с помощью CompressDeltaB то они всё время разные данные получаются... Из-за чего страдает CRC. 4 байта каких-то всё время отличаются. Неужели туда время записывается каждый раз новое, прям в буфер вшивается.
0
|
|
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
||||||
| 06.11.2024, 01:24 | ||||||
|
Ну наконец-таки, я сделал третью версию программки, для создания DLL из ресурсов.
Пришлось через CopyMemory насильно обрезать три байта в конце. Извините, это глюк майкрософта уже, я тут не при чём.
0
|
||||||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
||||||
| 06.11.2024, 01:50 | ||||||
|
А теперь вишинка на торте. Написал мини-версию этой программы для создания DLL. Здесь мы будем использовать чуть-чуть более старую версию DLL-библиотеки, которая занимаем всего 74Кб, версия 1.2.3, вместо 1.2.8, поэтому на выходе EXE теперь у нас получается всего 65536 байт! 65Кб! Это рекорд минимального размера EXE! Так как тут запакованный буфер занимает всего 39670 байт. Все контрольные суммы CRC32, мы конечно же, проверяем обязательно, чтобы исключить ошибки потери каких-то байтов. Мне итак приходится заниматься копированием через CopyMemory, ну а что поделаешь.. Ладно, вот новый код.
Код формы:
0
|
||||||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|
| 06.11.2024, 02:17 | |
|
А ещё можно знаешь как сделать? Можно например в папке вместе с программой распространять (копировать) самую новую библиотеку, а если этого файла вдруг не будет, то пусть тогда создаётся старая мини-версия 1.2.3 можно и так сделать, я только что подумал об этом. В любом случае в каталоге вместе с программой можно всегда распространять любую версию.
Добавлено через 30 секунд А можно и не делать этого, уже всё равно. Тут на вкус и цвет как бы. Добавлено через 56 секунд Главная задача выполнена по упаковке и распаковке буферов. Кстати я заметил что дельты пакуют файлы даже лучше чем сам ZIP. Добавлено через 24 секунды Но тесты ещё можно проводить конечно.
0
|
|
| 06.11.2024, 02:32 [ТС] | ||||||
|
На x64 чудо-функции запустить не получилось. Не пойму почему. Там где Long, он автоматически должен выравниваться до LongLong хоть в структуре, хоть в стеке. Пока так.
Кликните здесь для просмотра всего текста
0
|
||||||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|||
| 06.11.2024, 02:45 | |||
|
Добавлено через 2 минуты
1
|
|||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|||||
| 06.11.2024, 02:49 | |||||
|
Добавлено через 1 минуту Добавлено через 1 минуту Добавлено через 55 секунд
0
|
|||||
| 06.11.2024, 11:46 [ТС] | |||
|
Vba x64. В данном случае проверял в Автокаде. Я примерно понимаю из-за чего не идет. Чуть позже, думаю будет решение для x64
Добавлено через 21 минуту Ошибки можно по всякому выводить. Всегда есть вероятность порченного файла или еще чего. Лучше всего, наверное, когда функция сама определяет ошибку и еще выводит сообщение, чтобы не обрабатывать эту ошибку где-то во вне. Добавлено через 4 часа 4 минуты Добавлено через 2 минуты На Твинбейсике, по моему, возможно передавать структуры ByVal.. Там должен работать этот вариант Добавлено через 3 часа 50 минут В TwinBasic увы:
0
|
|||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
||||||
| 06.11.2024, 15:34 | ||||||
|
Придумал новый вариант кода для моего проекта "zlibwapi.dll from resources v.mini". Теперь мы не будем использовать CopyMemory для отрезания последних байт. Я вспомнил, что это можно делать стандартными средствами на VB6 без API с помощью ReDim Preserve. Слово Preserve там обязательно, иначе не работает, если просто ReDim.
1
|
||||||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|||
| 06.11.2024, 16:09 | |||
|
testuser2, эта функция проверяет существование функции внутри библиотеки DLL там "Is" надо потому что проверяется есть ли функция или нету функции, правда может надо было назвать IsFunctionDLL
Добавлено через 2 минуты testuser2, что ты прицепился к словам. я же не англичанин чтобы знать правописание ну. Добавлено через 1 минуту Добавлено через 4 минуты Добавлено через 4 минуты testuser2, нужно говорить простыми и понятыми словами, чтобы люди понимали, а не всякие там врапперы и ремарки...
0
|
|||
| 06.11.2024, 16:17 [ТС] | ||
|
0
|
||
| 06.11.2024, 16:17 | |
|
access и zip архив Как распаковать ZIP-файл в 7z?
Замена файла в zip архиве при совпадении имени Как сделать архив zip? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
|
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было
ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась.
Первый вариант. . .
|
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2.
Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
|
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет.
Но обычно это 50 лет и более.
Наверное, закисление почвы происходит сезонно в средней. . .
|
|
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
|
интеграция 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,. . .
|