Начиная с php версии 5.2, появилась замечательная фишка: работа с zip-архивами (ранее для этих целей использовались команды оболочки либо утилита pclzip.lib.php).
Далее предлагается несколько простых примеров. Однако, если на то будет желание, познакомиться с этой особенностью поближе можно из манов, запросив информацию по классу ZipArchive.
Т. к. это соответствующий класс, то сначала требуется создать его экземпляр, например, так:
$zip = new ZipArchive;
Теперь, нужно задать zip-файл, над которым будут производиться разного рода манипуляции (фактически, процесс похож на работу с функцией fopen(), с тем исключением, что здесь вызываются соответствующие методы класса):
$zip->open('test.zip', $flags);
Где $flags может принимать следующие значения:
значение не задано — открыть архив для извлечения файлов;
ZIPARCHIVE::OVERWRITE — перезаписать файл;
ZIPARCHIVE::CREATE — создать файл архива, если он не существует.
Имеются ещё некоторые значения, но с ними (если уж это действительно понадобится) можно ознакомиться на соответствующей странице мануала.
Когда архив открыт, фактически, его можно рассматривать как текущую папку, с которой можно производить разные манипуляции.
И теперь самое интересное: несколько методов, которых, на мой вгляд, хватит для выполнения 99.9% поставленных задач. Итак, вот они:
- bool addEmptyDir(string $dirname) — создание в архиве пустой директории;
- bool addFile(string $filename[, string $localname]) — добавляет в архив файл $filename под именем $localname. Если $localname не задано, файл добавляет в корень архива под именем $filename
с сохранением пути. чтобы было понятнее:
$zip->addFile('/var/www/site/index.php');
— создаст в архиве файл index.php, расположенный по адресу var/www/site/; - bool addFromString(string $localname, string $contents) — создание в архиве файла $localname с содержимым из переменной $contents;
- bool deleteName(string $name) — удаляет из архива файл или директорию с именем $name (для удаления директории необходимо, чтобы путь заканчивался слешем «/»!). Удаляемая директория должна быть пустой (не иметь файлов или вложенных папок)!;
- bool extractTo(string $destination [, mixed $entries ]) — распаковывает файл/файлы, указанные в $entries (может быть имя файла/папки, либо список имён) в директорию, заданную переменной $destination. Если $entries не задано, распаковывается архив целиком;
- bool renameName(string $name, string $newname) — переименовывает (или переносит) файл или пустую директорию, которые задаются переменной $name. новое имя задаётся переменной $newname;
- mixed statName(name $name[, int $flags]) — получает информацию о файле или директории $name, как то: размер, crc (контрольная сумма), время добавления и ещё некоторые. Переменная $flags позволяет определить, как будет вестись поиск файла, например, если задать значение ZIPARCHIVE::FL_NOCASE, поиск будет осуществляться без учёта регистра символов;
- bool unchangeAll() — откатывает все сделанные изменения;
- bool unchangeName(string $name) — откатить все изменения, сделанные с файлом (каталогом) $name.
Но лучше, конечно, всё посмотреть на примере. например, таком:
<?php
$testzip = 'mytest.zip';
$zip = new ZipArchive;
if (true === $zip->open($testzip, ZIPARCHIVE::CREATE)) {
$zip->addEmptyDir('dir1'); # создаём директорию
$zip->addEmptyDir('dir2'); # ещё один
# поместим тестовую строку в архив, в виде текстового файл
$zip->addFromString('dir1/123.txt', 'test string');
$zip->addEmptyDir('dir3'); # создаём ещё одну директорию
# удаляем директорию, созданную второй (внимание, слеш!!!)
$zip->deleteName('dir2/');
# поместим в архив текущий файл
$zip->addFile(__FILE__, 'dir3/' . pathinfo(__FILE__, PATHINFO_FILENAME));
$zip->close();
} else echo 'не удалось создать архив' . $testzip;
?>
После всех манипуляций полученный zip-архив должен содержать 2 папки: dir1 и dir2, а также по 1 файлу в каждой директрии.
PHP предоставляет великое множество “фишечек”. собственно, именно из-за этого (и заслуженно!) он пользуется такой популярностью.
Если тема показалась интересной, ‘тонко’ намекну: с помощью php можно также работать с популярным в среде линукс архивом формата bzip2 (который сжимает очень хорошо, но не умеет работать с группой файлов и директориями). Также поддерживается известный архиватор rar, правда, только для распаковки файлов (см. функции rar_open(), rar_entry_get() и метод extract()).
днём интернета
шоколадкой для работы мозга
коробочкой ароматного чая для бодрости
продлением хостинга на +1 месяц
А скажите можно данным классом поставить пароль на сам архив? очень буду благодарен,а то не где не написано как при помощи PHP можно поставить пароль на zip архив!
после всех манипуляций, полученный zip-архив должен содержать 2 папки: dir1 и dir2, а так по 1 файлу в каждой папке.
Как это так? А это чё? $zip->deleteName(‘dir2/’);
ЗЫЖ Directory это директория (жен.) как папка, а не деректорий.
начну ответ с конца:
по wiki:
http://ru.wikipedia.org/wiki/%D0%94%D0%B8%D1%80%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D1%8F — Директория (файловая система) — сущность в файловой системе, упрощающая организацию файлов.
если перейти по ссылочке Директория (файловая система), то можно встретить уже Директорий.
так что обозначения встречаются как для м, так и для ж родов.
если укажете на корректное обоснование (на сайте gramota.ru или подобном), исправлю.
по примеру: после отработки скрипта создаётся архив mytest.zip, в котором 2 папки: dir1 и dir3; в каждой папке по файлу: 123.txt и 1 соответственно.
пропустили строку
$zip->addEmptyDir(‘dir3’);
?
всё правильно, 2 папки
Большой толковый словарь
ДИРЕКТОРИЯ, -и; ж. [англ. directory] Информ.
Имя каталога, который содержит перечень файлов или подкаталогов, расположенн>х на магнитном диске компьютера или на дискете.
http://www.gramota.ru/slovari/dic/?lop=x&bts=x&zar=x&ab=x&sin=x&lv=x&az=x&pe=x&word=%E4%E8%F0%E5%EA%F2%EE%F0%E8%FF
Сергей, ок
спасибо
Хорошая статья.
Статья очень хорошая. Спасибо автору.
Только более практично ставить скобки после true === (тут выражение)