Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Создать архив и удалить исходную папку
Покинул форум
Сообщений всего: 77
Дата рег-ции: Окт. 2009 Откуда: Пятигорск
Помог: 0 раз(а)
Доброго дня. делают так. Создаю архив с помощью библиотеки PCLZip, при этом при добавлении файла в архив, сам файл удаляется с помощью функции myPostAddCallBack А затем удаляю эту папку. Так вот архив создается и файлы исходные все удаляются, а вот потом сама папка, хоть и пустая, не удаляется. Хотя если просто так ее потом удалить с помощью php получается.
Видимо удаление начинается до полного создания архива. Как сделать чтобы удаление начиналось после того как полностью завершаться работы с архивом.
IF(file_exists($path.$archiveName))rmdir($path.$folder);//-- если архив создан удаляем папку
Champion
Отправлено: 17 Февраля, 2010 - 09:45:24
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
leshiy_SV пишет:
Видимо удаление начинается до полного создания архива
У тебя многопоточная архитектура? Один поток архивирует, второй удаляет? Если нет, то твое предположение не верно.
А причины скорее всего в тексте сообщения об ошибке:
-ошибся в имени (или в пути) - знаешь как исправить
-доступ запрещен - скрипт может использовать эту папку. Возможно она открыта opendir и не закрыта closedir. Еще можно сменить каталог chdir. Может быть ты вошел в эту папку.
leshiy_SV
Отправлено: 17 Февраля, 2010 - 09:53:28
Гость
Покинул форум
Сообщений всего: 77
Дата рег-ции: Окт. 2009 Откуда: Пятигорск
Помог: 0 раз(а)
Champion пишет:
ошибся в имени (или в пути) - знаешь как исправить
не должно, потому как если архивировать пустую папку, то она потом сразу удаляется.
Champion пишет:
доступ запрещен - скрипт может использовать эту папку. Возможно она открыта opendir и не закрыта closedir.
вроде нет. это папка вообще никак не связана со скриптом. И опять таки пустая папка архивируется и тут же удаляется. значит есть доступ.
Champion пишет:
У тебя многопоточная архитектура? Один поток архивирует, второй удаляет? Если нет, то твое предположение не верно.
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
Когда она не удаляется, она, навреное, пишет тебе текст ошибки. Как думаешь, что с ним надо сделать?
leshiy_SV
Отправлено: 17 Февраля, 2010 - 12:05:22
Гость
Покинул форум
Сообщений всего: 77
Дата рег-ции: Окт. 2009 Откуда: Пятигорск
Помог: 0 раз(а)
Champion пишет:
пишет тебе текст ошибки
Permission denied или Доступ запрещен
интересно только как он может быть запрещен?
Даже если делаешь так, просто создать папку, заархивировать ее и удалить, то получается все, кроме последнего. Появляется ошибка доступ запрещен.
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
подумай. Только я не говорил добавть opendir, я совсем другое сказал. Хотя это другое ты тоже кое-как сделал.
leshiy_SV
Отправлено: 17 Февраля, 2010 - 12:52:13
Гость
Покинул форум
Сообщений всего: 77
Дата рег-ции: Окт. 2009 Откуда: Пятигорск
Помог: 0 раз(а)
Champion пишет:
Хотя это другое ты тоже кое-как сделал.
Я как надо правильно? просто уже ума не приложу. а opendir просто так кусочек воткнул и решил проверить работу скрипт.
никаких изменений о рабочем каталоге я не делал. код представленный здесь это и есть весь код. больше нет ничего. (Добавление)
После долгих размышлений. решил залезть в саму библиотеку pclzip.lib.php (использовал версию v.2.3) и посмотреть что где и почем. как говориться "Спасение утопающих — дело рук самих утопающих".
Вот что обнаружил, в блоке где идет открытие директории для считывание файлов есть строка $p_hdir = @opendir($p_filename), но закрывающей дескриптор этого каталога нигде не нашел, вместо это было просто unset($p_hdir); что походу не есть правильно. После того как я туда добавил closedir($p_hdir); Свершилось чудо и скрипт мой изначальный заработал
Вот так
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
leshiy_SV пишет:
Вот что обнаружил, в блоке где идет открытие директории для считывание файлов есть строка $p_hdir = @opendir($p_filename), но закрывающей дескриптор этого каталога нигде не нашел,
вооо, об этом и была речь. Молодец.
JustUserR
Отправлено: 17 Февраля, 2010 - 17:18:36
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
leshiy_SV Кстати на будущее проблема могла быть также в том что ваша функция архивирования могла изменять текущий каталог а при использовавнии функции rmdir и относительных путей данный каталог относительного нового базового положения мог и не существовать или быть недоступен
Еще может быть дело в реальном несовпадении прав доступа когда один CGI-скрипт работает от имени apache а другой нет - в таком случае надо либо использовать общую группу прав либо запусктать с битом setuid эффективного пользователя
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.