|
|
|
Распаковка многотомного ZIP архива
|
|||
|---|---|---|---|
|
#18+
Предыдущая ошибка касалась, как выяснилось, функции GetFileSize Но это мелочи... Вот катастрофически примитивный код: Код: pascal 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. срабатывает по нажатию на кнопку. Выдаёт все сообщения в том числе и Done, никаких эксепшнов, ничего. И распаковки, собственно, тоже никакой... Если у кого-то есть опыт работы с данным компонентом, буду чрезвычайно благодарен за подсказку! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2016, 19:42 |
|
||
|
Распаковка многотомного ZIP архива
|
|||
|---|---|---|---|
|
#18+
Замени TJclDecompressArchive на TJclZipDecompressArchive. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2016, 19:51 |
|
||
|
Распаковка многотомного ZIP архива
|
|||
|---|---|---|---|
|
#18+
NapalmRain, Можно еще принудительно все элементы в архиве выставить в Selected. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2016, 22:14 |
|
||
|
Распаковка многотомного ZIP архива
|
|||
|---|---|---|---|
|
#18+
AniskinЗамени TJclDecompressArchive на TJclZipDecompressArchive. Да, благодарю, всё получилось, но теперь новая проблема: EIntOverflow Если я правильно понимаю, проблема в размере архива, благо эта хрень весит 8 гигов... Если брать более новую версию 7z.dll, которая, как я думаю, должна бы уметь работать с 64 разрядными архивами, получаю ошибку: Код: pascal 1. Как я понимаю, самый простой для меня способ будет всё-таки использовать некий консольный архиватор. Если у кого-то есть мысли в этом направлении, поделитесь пожалуйста! Заранее благодарю! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2016, 22:41 |
|
||
|
Распаковка многотомного ZIP архива
|
|||
|---|---|---|---|
|
#18+
NapalmRainЕсли у кого-то есть мысли в этом направлении, поделитесь пожалуйста У меня есть мысль, что неплохо бы было взять в ручки дебаггер, и посмотреть, в каком же месте происходит исключение и его причины, и посмотреть, что странного происходит при загрузке 7z.dll. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2016, 22:45 |
|
||
|
Распаковка многотомного ZIP архива
|
|||
|---|---|---|---|
|
#18+
AniskinNapalmRainЕсли у кого-то есть мысли в этом направлении, поделитесь пожалуйста и посмотреть, что странного происходит при загрузке 7z.dll. A вот нефиг грузить из х32 приложения х64 библиотеку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2016, 01:22 |
|
||
|
Распаковка многотомного ZIP архива
|
|||
|---|---|---|---|
|
#18+
NapalmRain Как я понимаю, самый простой для меня способ будет всё-таки использовать некий консольный архиватор. Если у кого-то есть мысли в этом направлении, поделитесь пожалуйста! В принципе об этом уже говорили. А что непонятного в использовании? Вызов CreateProcess() с ожиданием завершения проблема? Тогда в JCL той же уже есть готовые функции. P.S. Насчет EIntOverflow непонятно - у JclXXXXDecompression все рабочие переменые в int64 - это еще постараться надо, чтобы на такое нарваться. И да, попробуй заменить версию 7z.dll на более новую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2016, 01:30 |
|
||
|
Распаковка многотомного ZIP архива
|
|||
|---|---|---|---|
|
#18+
DarkMasterA вот нефиг грузить из х32 приложения х64 библиотеку. Это было логичное предположение, но я скомпилировал приложение под 64 бита и ошибка не пропала. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. тогдка как переполнение Int происходит Код: pascal 1. 2. 3. 4. Переменная Index имеет тип Integer я заменил её на integer64 , но ошибка осталась ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2016, 23:31 |
|
||
|
Распаковка многотомного ZIP архива
|
|||
|---|---|---|---|
|
#18+
В общем я таки решил использовать сторонний архиватор. Два дня тестов дали результат практически тот, который интересует. Для использования взял последнюю версию 7z.exe Если кому интересно, конечный вариант: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. Где в процедуре ExtractTo может быть два варианта Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Для второго варианта Код: pascal 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. Вот примерно так. Всё это нагуглено, но протестировано и работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2016, 14:56 |
|
||
|
Распаковка многотомного ZIP архива
|
|||
|---|---|---|---|
|
#18+
AniskinЯ достаточно плотно ковыряюсь с 7z, пишу (в принципе, уже написано) интеграцию 7z с Проводником, что бы можно открывать 7z архивы как папки. Могу сказать следующее. В контексте формата zip cама 7z не знает ни о каких томах. 7z работает с обезличенным потоком, у которого нет имени. Поэтому в 7z нужно передавать уже готовый поток, в котором слиты воедино все тома. Я это делаю путем создания потока-посредника, который уже и реализует чтение из конкретных томов. Как это сделано в jcl - я не знаю, смотри их код. А каким образом Вы готовите поток, в котором слиты воедино все тома? Простое слияние упорядоченных файлов в один не помогает( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2018, 15:04 |
|
||
|
Распаковка многотомного ZIP архива
|
|||
|---|---|---|---|
|
#18+
Aniskin, Или хотя бы наводочку дайте, если не трудно. Очень требуется программно многотомник zip распаковать с помощью 7z.dll ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2018, 15:07 |
|
||
|
Распаковка многотомного ZIP архива
|
|||
|---|---|---|---|
|
#18+
xJuniorAniskinЯ достаточно плотно ковыряюсь с 7z, пишу (в принципе, уже написано) интеграцию 7z с Проводником, что бы можно открывать 7z архивы как папки. Могу сказать следующее. В контексте формата zip cама 7z не знает ни о каких томах. 7z работает с обезличенным потоком, у которого нет имени. Поэтому в 7z нужно передавать уже готовый поток, в котором слиты воедино все тома. Я это делаю путем создания потока-посредника, который уже и реализует чтение из конкретных томов. Как это сделано в jcl - я не знаю, смотри их код. А каким образом Вы готовите поток, в котором слиты воедино все тома? Простое слияние упорядоченных файлов в один не помогает( Только сейчас понял, что я набрехал. Извинюсь за дезинформацию. По теме - есть два варианта реализации разделения zip архива на тома. Первый - нативный zip-овский вариант. В нем дополнительные тома имеют расширение zNN, каждый том является независимым, имеет сигнатуры и т.д. В этом случае при открытии архива от callback процедуры требуется реализация интерфейса IArchiveOpenVolumeCallback. Черер этот интерфейс zip handler будут запрашивать потоки отдельных томов. Второй - нативный 7z-овский вариант. В нем дополнительные тома имеют расширение NNN, и тома получаются простым разделением zip архива на куски. В этом случае нужно создавать общий поток, содержащий все тома архива. (PS Поддержка нативного zip-овского варианта в 7-Zip появилась не сразу, возможно, на момент написания поста ее не было, тогда я не набрехал). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2018, 15:29 |
|
||
|
Распаковка многотомного ZIP архива
|
|||
|---|---|---|---|
|
#18+
Aniskin, Спасибо за разъяснение! Судя по Вашему описанию, я имею дело с первым (родным zip'овским) разделением. Из восьми томов отдельно как zip открываются только 4. Соответственно, не такие уж они и независимые (в том смысле, что отдельный том не есть отдельный zip-архив, если я правильно Вас понял). Вам доводилось сталкиваться с извлечением многотомников с помощью 7z? Пишу в Delphi 2007, но если есть пример реализации IArchiveOpenVolumeCallback на другом языке, буду и ему очень рад. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2018, 16:04 |
|
||
|
Распаковка многотомного ZIP архива
|
|||
|---|---|---|---|
|
#18+
xJuniorПишу в Delphi 2007, но если есть пример реализации IArchiveOpenVolumeCallback на другом языке, буду и ему очень рад.А чем конкретно проблема состоит? У вас что то уже реализовано или с нуля пишите? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2018, 16:11 |
|
||
|
Распаковка многотомного ZIP архива
|
|||
|---|---|---|---|
|
#18+
В дипломной работе должна быть возможность извлекать пусть не все, но хотя бы основные типы архивов. И я долгое время считал, что уж с zip'ом умею работать. Пока вот на многотомный архив не нарвался. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Эта конструкция никогда не подводила до недавнего времени(( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2018, 16:35 |
|
||
|
Распаковка многотомного ZIP архива
|
|||
|---|---|---|---|
|
#18+
Вы используете JclCompression? Тогда в список интерфейсов Код: pascal 1. 2. добавляйте интерфейс IArchiveOpenVolumeCallback и реализуйте его методы. Методов два - в GetStream открывайте том с переданным индексом, в GetProperty (если будет вызываться) возвращайте запрашиваемое свойство последнего открытого тома. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2018, 16:58 |
|
||
|
Распаковка многотомного ZIP архива
|
|||
|---|---|---|---|
|
#18+
Нет, я использую обёртку 7z для Delphi - модуль sevenzip.pas. В интерфейсах используемого класса уже есть нужный ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2018, 17:53 |
|
||
|
Распаковка многотомного ZIP архива
|
|||
|---|---|---|---|
|
#18+
И даже есть заглушки под его методы. В целом ваш совет понятен, спасибо, попробую реализовать эти методы. Просто думал у вас уже имеется готовый код, чтобы "велосипед не изобретать". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2018, 17:57 |
|
||
|
Распаковка многотомного ZIP архива
|
|||
|---|---|---|---|
|
#18+
Aniskin, Первым вызывается метод GetProperty с PROPID = kpidName. Пробовал по разному передать путь к следующему (второму) тому, передать просто имя файла следующего тома, пробовал передавать путь/имя первого тома - результат всегда один, извлекаются только файлы из первого тома. А GetStream вообще ни разу не выполняется. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Может ещё какие-то идеи подкинете? Заранее благодарен... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2018, 12:24 |
|
||
|
Распаковка многотомного ZIP архива
|
|||
|---|---|---|---|
|
#18+
xJunior, А работа с 7z принципиальна? или главное - результат? Тогда можете попробовать компонент fwZip от Rouse_ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2018, 12:37 |
|
||
|
Распаковка многотомного ZIP архива
|
|||
|---|---|---|---|
|
#18+
goldmi45, Да, принципиальна. Это мощный инструмент и всё может. Надо просто научиться... Переделывать всё на fwZip не представляется возможным( Abbrevia, кстати, тоже хорошо справляется с многотомниками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2018, 13:07 |
|
||
|
Распаковка многотомного ZIP архива
|
|||
|---|---|---|---|
|
#18+
xJuniorAniskin, Первым вызывается метод GetProperty с PROPID = kpidName. Пробовал по разному передать путь к следующему (второму) тому, передать просто имя файла следующего тома, пробовал передавать путь/имя первого тома - результат всегда один, извлекаются только файлы из первого тома. А GetStream вообще ни разу не выполняется. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Может ещё какие-то идеи подкинете? Заранее благодарен... При запросе kpidName нужно отдавать имя того тома, который вы передали изначально в Open. Я лично передаю просто имя без пути. И я не понял, с одной стороны вы говорите, что пытаетесь открыть нативные zip тома, но на практике передаете тома вида TempDel.zip.002, т.е. нативные 7z тома, которые не требуют плясок с IArchiveOpenVolumeCallback. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2018, 14:19 |
|
||
|
Распаковка многотомного ZIP архива
|
|||
|---|---|---|---|
|
#18+
AniskinИ я не понял, с одной стороны вы говорите, что пытаетесь открыть нативные zip тома, но на практике передаете тома вида TempDel.zip.002, т.е. нативные 7z тома, которые не требуют плясок с IArchiveOpenVolumeCallback. Хм, я почему-то решил, что механизм сборки томов работает одинаково, как для нативных 7z, так и для нативных zip архивов, т.е. пляски с IArchiveOpenVolumeCallback нужны всегда. Оказалось, что они нужны только для нативных zip-многотомников, как Вы и сказали. Хорошо, что Вы обратили на это внимание. Я подготовил нативный zip-многотомник, описал указанные два метода IArchiveOpenVolumeCallback (пока, правда, в примитивном виде), и о чудо, тома подтянулись один за другим! Всё заработало!!! Ура!!! Огромное Вам спасибо за профессионализм и оперативные подсказки! Мощь 7z.dll подтвердилась в очередной раз! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2018, 16:09 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39691841&tid=2038374]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
44ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
80ms |
get tp. blocked users: |
2ms |
| others: | 226ms |
| total: | 399ms |

| 0 / 0 |
