распаковать архив при загрузке - PullRequest
4 голосов
/ 29 июня 2011

У меня есть программа, которая загружает part01, затем part02 и т. Д. Из файла rar, разбитого по Интернету.Моя программа сначала загружает part01, затем part02 и так далее.После некоторых тестов я обнаружил, что, используя, например, UnRAR2 для Python, я могу извлечь первую часть файла (файл .avi), содержащийся в архиве, и могу воспроизводить его в течение первых минут.Когда я добавляю другой файл, он извлекает немного больше и так далее.Что мне интересно, так это: возможно ли заставить его извлекать отдельные файлы, пока они загружаются?Мне нужно, чтобы он начал извлекать part01, не дожидаясь окончания загрузки ... это возможно?

Большое спасибо!

Matteo

Ответы [ 3 ]

7 голосов
/ 30 июня 2011

Вы говорите о файле .avi в архивах rar. Вы уверены, что архивы на самом деле сжаты? Видеофайлы, выпущенные сценой warez, не используют сжатие:

Разорванные фильмы все еще упакованы из-за большого размера файла, но сжатие запрещено, а формат RAR используется только как контейнер. По этой причине современное программное обеспечение для воспроизведения может легко воспроизводить выпуск непосредственно из упакованных файлов и даже передавать его в потоковом режиме по мере загрузки релиза (если сеть достаточно быстрая).

(Я думаю, VLC, BSPlayer, KMPlayer, Dziobas Rar Player, rarfilesource, rarfs, ...) Вы можете проверить сжатие следующим образом:

  • Откройте первый архив .rar в WinRAR. (name.part01.rar или name.rar для имен томов старого стиля )
  • Нажмите кнопку информации.

Если Версия для извлечения указывает на 2.0, то архив не использует сжатие. (если у вас десятилетние рары) Вы можете видеть Общий размер и Упакованный размер будет равен.

можно ли его извлечь отдельные файлы при их загрузке?

Да. Если сжатие не используется, вы можете написать собственную программу для извлечения файлов. (Я знаю человека, который написал сценарий для прямой загрузки фильма из внешних rar-файлов; но он не является общедоступным, и у меня его нет.) Поскольку вы упомянули Python, я предлагаю вам взглянуть на rarfile 2.2 Марко Крин, как сделал автор pyarrfs . Архив - это просто файл, добавленный в заголовки (rar-блоки). Это будет операция копирования, которую необходимо приостановить до загрузки следующего архива.

Я твердо верю, что это также возможно для сжатых файлов. Ваш подход здесь будет другим, потому что вы должны использовать unrar для извлечения сжатых файлов. Я должен добавить, что существует также бесплатная реализация RARv3 для извлечения rars, реализованная в Unarchiver.

Я думаю, что этот параметр для (un) rar сделает возможным:

-vp     Pause before each volume

        By default RAR asks for confirmation before creating
        or unpacking next volume only for removable disks.
        This switch forces RAR to ask such confirmation always.
        It can be useful if disk space is limited and you wish
        to copy each volume to another media immediately after
        creation.

Это даст вам возможность приостановить извлечение до загрузки следующего архива.

Я считаю, что это не сработает, если rar был создан с включенной опцией 'solid'.

Если для rars используется сплошная опция, все упакованные файлы обрабатываются как один большой поток файлов . Это не должно вызывать проблем, если вы всегда начинаете с первого файла, даже если он не содержит файл, который вы хотите извлечь. Я также думаю, что это будет работать с архивами с паролем.

1 голос
/ 29 июня 2011

Я очень сомневаюсь в этом.По природе сжатия (насколько я понимаю), каждый бит необходим для его распаковки.Кажется, что источник, из которого вы скачиваете файлы, преднамеренно разбивал avi на части перед сжатием, но к тому времени, когда вы применяете сжатие, все, что вы сжимаете, теперь является одной атомной единицей.Таким образом, они любезно разбили все AVI на части, но каждая часть все еще является атомным нитом.

Но я не специалист по сжатию.

Единственный тест, о котором я сейчас могу думать, эточто-то вроде: curl <a href="http://example.com/Part01" rel="nofollow">http://example.com/Part01</a> | unrar.

0 голосов
/ 16 марта 2012

Я не знаю, задавался ли этот вопрос с учетом конкретного языка, но возможно потоковую передачу сжатого RAR непосредственно из Интернета и его распаковку на лету.Я могу сделать это с моей библиотекой C # http://sharpcompress.codeplex.com/

Формат RAR на самом деле довольно приятный.У него есть заголовки, предшествующие каждой записи, а сами сжатые данные не требуют произвольного доступа к потоку байтов.

Делайте это из нескольких частей, сначала вам нужно будет полностью извлечь часть 1, а затем продолжить запись, когдачасть 2 доступна.

Все это возможно с моим RarReader API.Твердые архивы также пригодны для потоковой передачи (на самом деле они только потоковые. Вы не можете получить произвольный доступ к файлам в твердом архиве. В значительной степени вам нужно извлечь их все сразу.)

...