Pull to refresh

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

Reading time 2 min
Views 6.1K
На днях я рассказывал, как получить список файлов, что содержит 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();                 # закрываем архив


Код с комментариями вы можете получить на GitHub'е.

А по факту?


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

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

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

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

Articles