PHP

индекс
206,76

RAR: создание store-архива

На днях я рассказывал, как получить список файлов, что содержит rar-архив без использования сторонних расширений или библиотек. В одном из комментариев промелькнула мысль, что в принципе, не смотря на закрытость алгоритма RAR, можно вручную создать архив без сжатия. Посидев один вечер над кодом, я представляю вашему вниманию класс для создания stored-RAR архивов.

Формат я ещё раз описывать не буду, он достаточно неплохо описан здесь или у меня в предыдущей статье. В этот раз мы просто рассмотрим, что умеет библиотека и какие у нас будут способы её расширения в будущем.

Пример работы


  1. $rar = new store_rar;          # создаём экземпляр класса
  2.   $rar->create("archive.rar"); # создаём архив
  3.   $rar->addFile("a.txt");      # пишем в него файл a.txt
  4.   $rar->addDirectory("b/c");   # создаём в архиве директорию "b" с поддиректорией "c"
  5.   $rar->addFile("d/e.txt");    # создаём директорию "d" и пишем в неё e.txt
  6. $rar->close();                 # закрываем архив


Полный исходный код: dev.rembish.ru/public/stored-rar.phps

А по факту?


Посмотрим, на что способен этот класс:
  • Создавать «пустые» rar-архивы :)
  • Создавать любую вложенность директорий одним вызовом addDirectory;
  • При создании уже существующей в архиве директории новый каталог создан не будет;
  • Записывать файл в поддиректорию без предварительного её создания.

Что стоит иметь ввиду:
  • Если «архивируемый» файл уже добавлен в архив, в архиве будут два (и т.д.) файла с одинаковым именем;
  • В классе нет поддержки unicode-символов (которая, отмечу, есть в 3.х версии RAR);
  • Нет функций переименования, удаления, перемещения файлов внутри архива, добавления файлов к архиву, разархивации файлов;
  • Нет поддержки мультитомных архивов.

Зачем нужна эта библиотека:
  • Для быстрой архивации некоторого объёма файлов с последующей отправкой их пользователю в виде одного архива;
  • Как доказательство того факта, что можно заархивировать в RAR без rar.dll :)

Что хотел бы сделать в будущем:
  • Поддержка операций с файлами внутри архива;
  • Поддержка unicode-имён;
  • Разбивка архивов на тома;
  • «Архивация» с паролем — не уверен, что возможно.
+36
31 октября 2009, 19:14
46

комментарии (44)

+2
kabachok #
zip меньше бьется, а вообще — молодец, хороший велосипед получился, жалко одноколесный.
0
DonRamon #
Ну да, это скорее спортивное программирование.
+1
maxcom #
zip не очень удобен для записи без сжатия — там нужно сначала расчитать CRC, так что потоком в него лить нельзя
+1
Gorthauer87 #
А можт лучше всё таки tar изобрести?
–11
DonRamon #
TAR очень сильно увеличивает объём исходных файлов. Тут же заголовок совсем небольшой.
0
mocksoul #
с какого перепугу?
+2
DonRamon #
Мда, видать я не туда посмотрел и увидел не тот размер. Век живи — век учись. Признаю ошибку.
0
litos #
tar можно пропускать через gzip или bzip2 и все это потоковое сжатите
+1
DonRamon #
Да ясно, что можно — я не говорю, пользуйтесь мои бобролётом без сжатия. Этот топик лишь рассказывает о том, что если сильно захотеть можно и RAR-архив самому создать. И всё. Я за использование .gz, .bz2, .7z. Хотя предпочитаю .zip, который можно разархивировать везде из коробки.
НЛО прилетело и опубликовало эту надпись здесь
0
DonRamon #
Ну что ж Вы так сразу же богомезкий — формат заслужил признание простых (не таких, как мы с вами) пользователей, нам (разработчикам) приходится с этим жить.
НЛО прилетело и опубликовало эту надпись здесь
–1
kAIST #
Да уж… Для среднестатистического пользователя слова «архив» и «винрар» синонимы…
+5
DerKetzer #
Простые пользователи не выбирали RAR (я уверен, что большинство из них даже не подозревает что это такое), просто им поставил WinRAR знакомый «гуру». Страна бесплатных фотошопов же.
0
Tamerlaan #
Тем не менее, насколько мне известно, большинство юзеров пользуются именно RAR…
0
DerKetzer #
В России, Европе, мире? Про Россию, я как раз выше и написал. А вот если приведете пруф на общемировую статистику это будет интересно.
0
DonRamon #
0
DerKetzer #
WinZip 194,363,812 total downloads
WinRAR 84,934,671 total downloads

Это при условии, что упаковка/распаковка ZIP поддерживается в виндовс штатными средствами, в отличие от RAR.
0
DonRamon #
Вот смотрите — 193 миллиона WinZip, WinRAR — 84 миллиона, WinACE (третий) — почти 4 миллиона (почти незначительная часть). Итого, третья часть загрузок WinRAR — не маленькая часть, которой не стоит пренебрегать.
0
DerKetzer #
Не забываем о том, что распакавка RAR не поддерживается из коробки ни в одной ОС, и в частности в виндовс. Пользователю присылают RAR-архив, что он делает? Правильно ищет в гугле и находит WinRAR.

Хотя 84 миллиона это очень много, но тем не менее это не повод поддерживать проприетарный формат.
0
DonRamon #
Хорошо, но что-то заставляет пользователей сжимать в RAR? Не так ли? Давайте вспомним, как поступает WinRAR, когда его ставят в систему — он делает форматом по умолчанию себя, хотя вполне себе сжимает в ZIP. Большая часть пользователей, установивших WinRAR волей или неволей сжимают в него свои данные дальше — с этим ничего не сделаешь, с этим приходится мириться. В конце концов, пользователь привыкает и уже уверен в том, что на другом конце файл откроют (к слову, WinZIP умеет открывать RAR). Почему же не дать ему возможность получать файл в привычном ему формате.

Я не преувеличиваю и не выгораживаю RAR — это закрытый формат с соответствующими минусами. Я лишь предлагаю с ним считаться. Он есть, он заслужил своих поклонников, он предоставляет из коробки лучшее сжатие и лучшую защиту информации (AES 128 bit), чем тот же ZIP. Да и вспомните, сколько Windows пользователей пользуются BZ2, GZ, 7ZIP? Не предложение рождает спрос — совсем наоборот.
0
DerKetzer #
Пользователю все равно. «Он» не понимает разницы между ZIP, RAR, 7ZIP, BZ2. Как вы думаете, многие пользователи знают что такое AES 128 bit и чем он отличается от других криптоалгоритмов? А запаковывают в RAR, как вы сами сказали, потому что WinRAR делает так по-умолчанию.

И я вовсе не предлагаю всем перейти на BZ2, GZ, 7ZIP. Есть ZIP, который является стандартом де-факто. И с ним нет проблем ни на одной платформе. И WinRAR его прекрасно открывает :)
+4
Mercury13 #
7z используйте, он поддерживается свежими версиями WR.
–3
Zyava #
У Вас какой-то особенный 7zip? Он ведь только распаковывать может RAR архивы, вот даже цитата с оффсайта:
Supported formats:
Packing / unpacking: 7z, ZIP, GZIP, BZIP2 and TAR
Unpacking only: ARJ, CAB, CHM, CPIO, DEB, DMG, HFS, ISO, LZH, LZMA, MSI, NSIS, RAR, RPM, UDF, WIM, XAR and Z.

А эта статья о том как запаковать файлы в RAR архив.
+3
DonRamon #
Ещё раз повторюсь — в RAR со сжатием может запаковывать только сам RAR. Это закрытый формат.
0
Mr_Floppy #
Я думаю, автор хотел сказать, что последование версии WinRAR поддерживают распаковку формата 7-ZIP (LZMA). А для поточной записи в файл без сжатия, да, лучше таки TAR изобрести.
–1
DonRamon #
RAR вполне возможно передавать потоком. Каждый файловый блок независим — передаём заголовок блока, тело блока и так далее.
0
litos #
Что мешает использовать православный tar gzip?
0
DonRamon #
Ничего не мешает. Этот топик не является аргументом замены тарбола на rar.
0
litos #
Однако, например, tar поддерживает сохранение прав на файлы и симлинков, а rar нет, соответственно не пригоден для резервного копирования unix-сервера
+2
fonmax #
use LZMA, %LUKE% (7z / bz2 etc)!
+1
ChelOut #
Жаль под мак нет версии(((
0
DonRamon #
А в чём отличие версии под Мак? И, если не секрет, зачем она Вам может понадобиться?
НЛО прилетело и опубликовало эту надпись здесь
+1
Cancel #
Опыт. Любопытство. Этого, как мне кажется, достаточно.
НЛО прилетело и опубликовало эту надпись здесь
0
Cancel #
А как определять нужность-ненужность? Кто будет решать? Я ничего особо криминального в таком опыте не вижу, довольно неожиданное применение. Автор сам распоряжается своим временем и тратит его с пользой, ибо бесполезного опыта программирования не бывает.
НЛО прилетело и опубликовало эту надпись здесь
0
Busla #
Поздравляю, вы нарушили лицензию rar'а. Ладно бы для себя и в исследовательских целях. Но использование этой библиотеки может и владельцам сайта выйти боком.
0
Cancel #
А какую именно лицензию? Далеко не всякое творчество авторов проприетарных лицензий (в том числе патенты на алгоритмы) у нас в стране действуют.
0
DonRamon #
Кстати, да — можно посмотреть на лицензию?
0
Tamerlaan #
www.win-rar.com/gtb_priv.html
возможно оно?
0
DonRamon #
Я пробежался по этой лицензии, но не нашёл места, где сказано, что нельзя архивировать в RAR самому. Поправьте меня, если я не прав.
0
mocksoul #
Присоединяюсь к предыдущему оратору. Таки-да, Вы мало того что нарушаете лицензию rarlabs так ещё и распространяете Вашу поделку всем и вся =).

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.