Пятница , 29 Март 2024
ДомойПубликацииРабота с zip-архивами в php

Работа с zip-архивами в php

Начиная с php версии 5.2, появилась замечательная фишка: работа с zip-архивами (ранее для этих целей использовались команды оболочки либо утилита pclzip.lib.php).

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

1

Т. к. это соответствующий класс, то сначала требуется создать его экземпляр, например, так:

$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()).

Рейтинг: 0

Автор публикации

2 070
не в сети 11 месяцев

x64 (aka andi)

Комментарии: 2893Публикации: 405Регистрация: 02-04-2009
Так себеНеплохоХорошоЗамечательноСупер! (Оценок пока нет)
Загрузка...

7 комментариев

  1. А скажите можно данным классом поставить пароль на сам архив? очень буду благодарен,а то не где не написано как при помощи PHP можно поставить пароль на zip архив!

    Рейтинг: 0
  2. после всех манипуляций, полученный zip-архив должен содержать 2 папки: dir1 и dir2, а так по 1 файлу в каждой папке.

    Как это так? А это чё? $zip->deleteName(‘dir2/’);

    ЗЫЖ Directory это директория (жен.) как папка, а не деректорий.

    Рейтинг: 0
  3. начну ответ с конца:
    по 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 папки

    Рейтинг: 0
  4. Большой толковый словарь
    ДИРЕКТОРИЯ, -и; ж. [англ. 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

    Рейтинг: 0
  5. Сергей, ок
    спасибо

    Рейтинг: 0
  6. Хорошая статья.

    Рейтинг: 0
  7. Статья очень хорошая. Спасибо автору.
    Только более практично ставить скобки после true === (тут выражение)

    Рейтинг: 0

Оставить комментарий

Политика конфиденциальности

Наш сайт использует файлы cookies, чтобы улучшить работу и повысить эффективность сайта. Продолжая работу с сайтом, вы соглашаетесь с использованием нами cookies и политикой конфиденциальности.

Принять