Статьи

File_Archive

Я вчера вернулся из Торонто, хотя я был слишком уставшим, чтобы что-то делать, несмотря на то, что я вернулся домой около 10 утра! Но теперь я готов продолжать регулярно отправлять сообщения.

Я готовлюсь к выпуску новой версии (1.2) одного из моих продуктов. Одна из функций этого позволяет вам автоматически генерировать zip, tar, gzip и bzip файлы вашего продукта, чтобы их можно было распространять среди ваших клиентов. Вы загружаете файлы, и приложение генерирует архив.

Когда я писал этот раздел кода, я потратил довольно много времени на поиски классов, которые помогут в создании архива. Я твердо верю в повторное использование кода, который делается доступным в библиотеках, а не написание его самостоятельно. Это экономит много времени! Я посмотрел во многих местах и ​​попробовал несколько классов — они работали, но не полностью. Например, были проблемы с поврежденными zip-файлами или с неподдерживаемыми каталогами. В конце концов я остановился на классе PEAR под названием File_Archive, который очень хорош!

File_Archive : File_Archive позволит вам легко манипулировать файлами tar, gz, tgz, bz2, tbz, zip, ar (или deb)

Он не только делает все, что вам может понадобиться для архивов, но и активно развивается. Я предоставил несколько сообщений об ошибках, и они всегда быстро реагируют и исправляются — часто в течение нескольких часов после сообщения. Когда я начал его использовать, доступные документы были не так уж хороши, но теперь они были значительно улучшены и обновлены.

Прежде чем приступить к написанию кода, важно решить, какой тип архива вы собираетесь создать. Документация предоставляет очень хорошее описание того, на что обращать внимание:

Выбор формата файла важен, если вы хотите эффективную генерацию. Давайте посмотрим, каковы возможности:

  • деготь
    Плюсы: генерация очень эффективна, постоянное использование памяти, нет необходимости кэшировать
    Минусы: нет сжатия (но в любом случае изображения или видео трудно сжать), не так широко используется, как Zip
  • Тгз, тбз
    Плюсы: очень высокая степень сжатия, постоянное использование памяти
    Минусы: не может быть кэширован, требует много процессора в каждом поколении
  • застежкамолния
    Плюсы: промежуточный результат может быть кэширован, сжат, вы можете выбрать уровень сжатия, широко используется
    Минусы: степень сжатия ниже, чем для Tgz / Tbz

С http://poocl.la-grotte.org/example.php

File_Archive включает в себя несколько функций, которые будут полезны для обработки файлов и их архивов (отсюда и название!). Эти примеры были взяты из документации File_Archive для иллюстрации библиотеки.

Читатели

Читатели позволяют вам читать файлы, каталоги, а также архивы файлов / каталогов. Сгенерированный список хранится внутри объекта, поэтому его можно использовать позже при архивировании или обслуживании пользователей. Например, если вы хотите прочитать архив и, следовательно, распаковать его:

$source = File_Archive::read('path/to/dir/archive.tar');

писатели

Авторы будут осуществлять фактическую запись архивов на диск или в память. Существует также функция, которая может отправлять созданный архив в виде вложения в электронное письмо. Вы должны вызвать читателя перед тем, как писать, чтобы получить содержимое для создания архива. Например, этот пример отправит все файлы в текущем каталоге по электронной почте:

File_Archive::extract(
File_Archive::read('path/to/dir', '', 0, 0),
File_Archive::toMail('to@example.com', array('Subject' => 'path/to/dir directory', 'From' => 'example@example.com'), 'body'));

Кэширование

В File_Archive 1.4 появилась возможность использовать кеш для хранения промежуточного результата сжатия zip. Для этого используется пакет PEAR Cache_Lite.

Zip-файл состоит из сжатых файлов, один за другим. Таким образом, если вы создаете архив, содержащий файлы A, B и C, а затем другой архив, содержащий A и C, вы сожмете в два раза файлы A и C. Использование кэша позволит сохранить сжатую версию файлов A, B и C на первом сжатии, чтобы использовать их снова во втором сжатии.

На моей машине (ThinkPad T42P с заводским оборудованием по умолчанию) для создания zip-архива объемом 200 МБ требуется около 30 с ЦП без кеша, 32 с ЦП с пустым кешем и 2 с ЦП, если все файлы для сжатия уже находятся в кеше

http://poocl.la-grotte.org/tutorial/cache.php

Полезная функция

Вот функция, которую я использовал в своем продукте для быстрого создания любого поддерживаемого архива из существующего каталога (и всего его содержимого):

Эта функция принимает 2 аргумента: тип архива, который вы хотите создать — [font = Courier New] строка $ type [/ font], и имя каталога, который вы хотите архивировать — [font = Courier New] строка $ directory [ /шрифт]. Архив создается с тем же именем, что и каталог. Опции для передачи в [font = Courier New] $ type [/ font] могут быть следующими: tgz, tbz, tar, zip, gz, gzip, bz2, bzip2 или любой их состав (например, tar.gz или tar. BZ2). Случай этого параметра не важен.

extract(File_Archive::toArchive($directory.$type, File_Archive::toFiles()));
}
else
{
trigger_error('Directory '.$location.' does not exist', E_USER_ERROR);
}
}
?>

Надеюсь, вы найдете это полезным в ваших собственных программах.

связи