Программа: Unzip

Программа unzip.php, показанная в примере 18.5, извлекает файлы из ZIP-архива. Она основана на функции pc_mkdir_parents(), которая определена в рецепте 19.10. Программа также требует установки PHP-расширения zip. Документацию по расширению zip можно найти на http://www.php.net/zip.

Эта программа принимает несколько аргументов командной строки. Первый – имя ZIP-архива, который следует распаковать. По умолчанию она распаковывает все файлы архива. Если в командной строке представлены дополнительные аргументы, то распаковываются только те файлы, имена которых совпадают с каким-либо из этих аргументов. Внутри ZIP-архива должен быть указан полный путь к файлу. Если файл turtles.html находится в ZIP-архиве внутри каталога animals, то для того чтобы распаковать файл, программе unzip.php надо передать animals/turtles.html, а не просто turtles.html.
Каталоги внутри ZIP-архивов хранятся как файлы, содержащие 0 байт, поэтому программа unzip.php не пытается их создавать. Вместо этого перед созданием какого-либо файла она вызывает функцию pc_mkdir_parents() для создания всех родительских каталогов файла, если это необходимо. Предположим, что программа unzip.php видит в ZIP-архиве следующие вхождения:

animals (0 bytes)
animals/frogs/ribbit.html (2123 bytes)
animals/turtles.html (1232 bytes)

Она игнорирует animals как имеющий длину 0 байт.


Затем она вызывает функцию pc_mkdir_parents() для animals/frogs, создавая и animals, и animals/frogs, и записывает файл ribbit.html в каталог animals/frogs. Каталог animals уже существует, поэтому когда программа доходит до animals/turtles.html, она записывает файл turtles.html без создания каких-либо дополнительных каталогов.

Пример 18.5. unzip.php
// первый аргумент – это zip-файл
$in_file = $_SERVER['argv'][1];
// любые другие аргументы – это указанные архивные файлы для распаковки
if ($_SERVER['argc'] > 2) {$all_files = 0;
for ($i = 2; $i < $_SERVER['argc']; $i++) {
$out_files[$_SERVER['argv'][$i]] = true;
}
} else {
// если не указано других файлов, то распаковываем все файлы
$all_files = true;
}
$z = zip_open($in_file) or die("can't open $in_file: $php_errormsg");
while ($entry = zip_read($z)) {
$entry_name = zip_entry_name($entry);
// проверяем, должны ли распаковываться все файлы или находится
// ли имя этого файла в списке файлов для распаковки
if ($all_files || $out_files[$entry_name]) {
// продолжаем, только если длина файла отлична от 0 байт
if (zip_entry_filesize($entry)) {
$dir = dirname($entry_name);
// создаем все необходимые каталоги, указанные в пути к файлу
if (! is_dir($dir)) { pc_mkdir_parents($dir); }
$file = basename($entry_name);
if (zip_entry_open($z,$entry)) {
if ($fh = fopen($dir.'/'.$file,'w')) {
// записываем весь файл
fwrite($fh,
zip_entry_read($entry,zip_entry_filesize($entry)))
or error_log("can't write: $php_errormsg");
fclose($fh) or error_log("can't close: $php_errormsg");
} else {
error_log("can't open $dir/$file: $php_errormsg");
}
zip_entry_close($entry);
} else {
error_log("can't open entry $entry_name: $php_errormsg");
}
}
}
}.



Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Блокировка файла
Выбор случайной строки из файла
Запись в несколько файловых дескрипторов одновременно
Запись в стандартный поток вывода
Непосредственная модификация файла без временной копии

Вернуться в раздел: PHP / 18. Файлы