[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вопрос про распаковку архива
minoss
Доброго времени суток.
Есть код:
    <?PHP
include('pclzip.lib.php'); //подключаем библиотеку
$archive = new PclZip('archive.zip'); //имя архива
if ($archive->extract(PCLZIP_OPT_PATH, 'data', //в какую папку будем распаковывать
PCLZIP_OPT_REMOVE_PATH, '1238') == 0) { //пропускаем путь 1238 при распаковке
die("Error : ".$archive->errorInfo(true));
}
?>

Вот, данные код работает отлично, но, проблема заключается в том, что при распаковке архива, файлы не заменяются (т.е. если в папке "data" есть файл readme.txt, и в архиве есть такой же файл, то тот который в архиве не заменит того, который уже есть), вот в прочем в этом вся и проблема.
Т.е. у меня не получается сделать замену файлов, если таковые уже присутствуют.

P.S.
Объяснил как смог, если что, прошу прощения.
Заранее благодарен.
Haotarez
minoss
надо просто выставить на существующие файлы права chmod 777 и всё будет тип-топ

_____________
самые трудные пути легче преодолевать за счет отсутствия конкуренции.
Guest
Haotarez, увы нет, не помогло.
Haotarez
Guest очень странно, у меня на отлично заменяются - права на папку и содержимое 0777. Думаю в вашем случае стоит тогда "извратнуться" и при распаковке через callback_pre_extract() проверять в директории существует ли такой файл и если да, удалять его перед распаковкой. Производительность упадет сильно - предупреждаю сразу, но другого выхода из ситуации не вижу. Хотя с либой работал не много, и возможно моё мнение - мнение дилетанта.


_____________
самые трудные пути легче преодолевать за счет отсутствия конкуренции.
Guest
Haotarez, я тоже думал о "callback_pre_extract", но нагрузка будет очень большая, потому что файлов может быть более 3000.
Да и на счёт прав, даже если в таком случае получится, то, потом как-то исправлять придётся все права.
Я ещё пробовал через класс "ZipArchive", он заменяет как надо, но проблема заключается в отсутствие такой функции как "PCLZIP_OPT_REMOVE_PATH"...
Guest
Никто больше не поможет?...Печаль...
twin
Вот этот костыль поможет.
<?php

function
ExtractCallBack($p_event, &$p_header)
{
$info = pathinfo($p_header['filename']);
@unlink($info['dirname'] .'/'. $info['basename']);
return 1;
}


include('pclzip.lib.php'); //подключаем библиотеку
$archive = new PclZip('archive.zip'); //имя архива
if ($archive->extract(PCLZIP_OPT_PATH, 'data', //в какую папку будем распаковывать
PCLZIP_CB_PRE_EXTRACT, 'ExtractCallBack',
PCLZIP_OPT_REMOVE_PATH, '1238') == 0) { //пропускаем путь 1238 при распаковке
die("Error : ".$archive->errorInfo(true));
}


И совершенно напрасно боитесь нагрузок. Юзая такую библиотеку бояться маленькой дополнительной функции не стоит. Тем более такой безобидной.

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
twin
Если все же не устраивает костыль, другой вариант.
Я тут малость порылся в либе (да простят меня разработчики, лицензия позволяет) и добавил вожделенный параметр. Вызывать так:

<?php


include('pclzip.lib.php'); //подключаем библиотеку
$archive = new PclZip('archive.zip'); //имя архива
if ($archive->extract(PCLZIP_OPT_PATH, 'data',//в какую папку будем распаковывать
PCLZIP_OPT_REMOVE_PATH, '1238',//пропускаем путь 1238 при распаковке
PCLZIP_OPT_SUBSTITUE_FILE, true) == 0) { // Заменяем файлы
die("Error : ".$archive->errorInfo(true));
}


Измененная либа вот (сильно не тестил, на ваш страх и риск):


_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Guest
twin, ого, и правда, работает, большое спасибо.
Guest
P.S. Надеюсь, что нагрузки не будет, по крайней мере большой...
LRCenter
А почему вообще такое происходит? У меня на одном хосте два сайта - на одном все прекрасно заменяется, при распаковке, на другом нет. blink.gif Прям аномалия какая-то sad.gif

_____________
Меньше кода - меньше багов ©
LRCenter
Цитата
- Add optional attribute PCLZIP_OPT_REPLACE_NEWER. This will force, during an extract' the replacement of the file, even if a  newer version of the file exists.
Note that today if a file with the same name already exists but is older it will be replaced by the extracted one.


Я правильно понимаю что, библиотека сравнивает при распаковке версии файлов и заменяет только если дата создания(изменения?) файла в архиве позже чем в ФС?

_____________
Меньше кода - меньше багов ©
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.