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

  1. Автор публікації

Починаючи з 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 ()).

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

не в мережі 6 годин

x64 (aka andi)

Коментарі: 2837 Публікації: 394 Реєстрація: 02-04-2009Testzip; ?