Работа с zip архивами29.10.2024, 02:49. Показов 19677. Ответов 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,787
|
|
| 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,787
|
|
| 05.11.2024, 18:41 | |
|
Флаг-то сработал, я верно угадал значит, прочитав документацию, но вот скорость разочаровала
Упаковка 40 Мб: 23 секунды! жесть как медленно! Зато на выходе получилось всего 2 Мб! Сжало аж в 20 раз! Распаковка обратно занимает 312 млск терпимо ещё кстати.
0
|
|
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,787
|
|||||||
| 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,787
|
|
| 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,787
|
||||||
| 06.11.2024, 01:24 | ||||||
|
Ну наконец-таки, я сделал третью версию программки, для создания DLL из ресурсов.
Пришлось через CopyMemory насильно обрезать три байта в конце. Извините, это глюк майкрософта уже, я тут не при чём.
0
|
||||||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,787
|
||||||
| 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,787
|
|
| 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,787
|
|||
| 06.11.2024, 02:45 | |||
|
Добавлено через 2 минуты
1
|
|||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,787
|
|||||
| 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,787
|
||||||
| 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,787
|
|||
| 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 | |
|
Помогаю со студенческими работами здесь
160
access и zip архив Как распаковать ZIP-файл в 7z?
Замена файла в zip архиве при совпадении имени Как сделать архив zip? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер.
Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
|
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта
Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
|
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром.
возможно получится прикрутить интерпретатор питон для кастомизации игровой логики.
что есть на текущий момент:. . .
|
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2.
Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
|
|
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
|
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2.
Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
|
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2.
Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом.
В. . .
|
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2.
Задача: отобразить спецтехнику, которая на данный момент находится в ремонте.
Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
|