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 :: Создать архив и удалить исходную папку

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Описание: Задержать выполнение функции до полного выполнения предыдущей
leshiy_SV
Отправлено: 17 Февраля, 2010 - 09:26:48
Post Id



Гость


Покинул форум
Сообщений всего: 77
Дата рег-ции: Окт. 2009  
Откуда: Пятигорск


Помог: 0 раз(а)




Доброго дня. делают так. Создаю архив с помощью библиотеки PCLZip, при этом при добавлении файла в архив, сам файл удаляется с помощью функции myPostAddCallBack А затем удаляю эту папку. Так вот архив создается и файлы исходные все удаляются, а вот потом сама папка, хоть и пустая, не удаляется. Хотя если просто так ее потом удалить с помощью php получается.
Видимо удаление начинается до полного создания архива. Как сделать чтобы удаление начиналось после того как полностью завершаться работы с архивом.
PHP:
скопировать код в буфер обмена
  1. function myPostAddCallBack($p_event, &$p_header){
  2. IF ($p_header['status'] == 'ok')  // ----- проверяем удачное добавление
  3.    unlink($p_header['filename']); // ----- удаляем файлы
  4. }
  5.  
  6. $archive = new PclZip($path.$archiveName);
  7. $unarc=($fileList=$archive->create($path.$folder,
  8.                 PCLZIP_OPT_REMOVE_PATH,$path,
  9.                 PCLZIP_CB_POST_ADD, myPostAddCallBack));
  10.  
  11. IF(file_exists($path.$archiveName)) rmdir($path.$folder); //-- если архив создан удаляем папку
  12.  
 
 Top
Champion Супермодератор
Отправлено: 17 Февраля, 2010 - 09:45:24
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




leshiy_SV пишет:
Видимо удаление начинается до полного создания архива
У тебя многопоточная архитектура? Один поток архивирует, второй удаляет? Если нет, то твое предположение не верно.
А причины скорее всего в тексте сообщения об ошибке:
-ошибся в имени (или в пути) - знаешь как исправить
-доступ запрещен - скрипт может использовать эту папку. Возможно она открыта opendir и не закрыта closedir. Еще можно сменить каталог chdir. Может быть ты вошел в эту папку.
 
 Top
leshiy_SV
Отправлено: 17 Февраля, 2010 - 09:53:28
Post Id



Гость


Покинул форум
Сообщений всего: 77
Дата рег-ции: Окт. 2009  
Откуда: Пятигорск


Помог: 0 раз(а)




Champion пишет:
ошибся в имени (или в пути) - знаешь как исправить
не должно, потому как если архивировать пустую папку, то она потом сразу удаляется.
Champion пишет:
доступ запрещен - скрипт может использовать эту папку. Возможно она открыта opendir и не закрыта closedir.
вроде нет. это папка вообще никак не связана со скриптом. И опять таки пустая папка архивируется и тут же удаляется. значит есть доступ.
Champion пишет:
У тебя многопоточная архитектура? Один поток архивирует, второй удаляет? Если нет, то твое предположение не верно.
А как с этим быть?

(Отредактировано автором: 17 Февраля, 2010 - 09:55:28)

 
 Top
Champion Супермодератор
Отправлено: 17 Февраля, 2010 - 10:06:19
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Первые два утверждения все-таки проверить надо. А в последнем я очень сомневаюсь)
 
 Top
leshiy_SV
Отправлено: 17 Февраля, 2010 - 10:32:18
Post Id



Гость


Покинул форум
Сообщений всего: 77
Дата рег-ции: Окт. 2009  
Откуда: Пятигорск


Помог: 0 раз(а)




А как проверить?
Если убрать архивирование и просто оставить пустую папку и написать

это она удаляется. Это что нибудь говорит или нет

(Отредактировано автором: 17 Февраля, 2010 - 10:34:15)

 
 Top
Champion Супермодератор
Отправлено: 17 Февраля, 2010 - 10:36:34
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Когда она не удаляется, она, навреное, пишет тебе текст ошибки. Как думаешь, что с ним надо сделать?
 
 Top
leshiy_SV
Отправлено: 17 Февраля, 2010 - 12:05:22
Post Id



Гость


Покинул форум
Сообщений всего: 77
Дата рег-ции: Окт. 2009  
Откуда: Пятигорск


Помог: 0 раз(а)




Champion пишет:
пишет тебе текст ошибки

Permission denied или Доступ запрещен
интересно только как он может быть запрещен?
Даже если делаешь так, просто создать папку, заархивировать ее и удалить, то получается все, кроме последнего. Появляется ошибка доступ запрещен.
PHP:
скопировать код в буфер обмена
  1. mkdir($path.$folder, 0777);
  2.  require_once("pclzip.lib.php");
  3.           $archive = new PclZip($path.$folder.".zip");
  4.           $fileList=$archive->create($path.$folder,
  5.                 PCLZIP_OPT_REMOVE_PATH,$path);
  6. rmdir($path.$folder.);
  7.  

(Отредактировано автором: 17 Февраля, 2010 - 12:21:58)

 
 Top
Champion Супермодератор
Отправлено: 17 Февраля, 2010 - 12:21:24
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Ну вот, значит с путями правильно. Тогда ответь про opendir и про то, где ты находишься
 
 Top
leshiy_SV
Отправлено: 17 Февраля, 2010 - 12:24:20
Post Id



Гость


Покинул форум
Сообщений всего: 77
Дата рег-ции: Окт. 2009  
Откуда: Пятигорск


Помог: 0 раз(а)




Champion пишет:
Тогда ответь про opendir
В смысле? открыть папку ту, которую пытаю удалить?
Champion пишет:
и про то, где ты находишься

удаляемая папка дважды вложена от папки со скриптом

(Отредактировано автором: 17 Февраля, 2010 - 12:28:19)

 
 Top
Champion Супермодератор
Отправлено: 17 Февраля, 2010 - 12:32:23
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




leshiy_SV пишет:
В смысле? открыть папку ту, которую пытаю удалить?
Давай ты прочитаешь что я в самом начале написал
leshiy_SV пишет:
удаляемая папка дважды вложена от папки со скриптом
Я спросил где ты на самом деле находишься? Не менял ли ты текущую директорию командой chdir?
 
 Top
leshiy_SV
Отправлено: 17 Февраля, 2010 - 12:34:52
Post Id



Гость


Покинул форум
Сообщений всего: 77
Дата рег-ции: Окт. 2009  
Откуда: Пятигорск


Помог: 0 раз(а)




Champion пишет:
Не менял ли ты текущую директорию командой chdir?

нет ничего такого.
Блин. после того как добавил opendir? как вы говорили
PHP:
скопировать код в буфер обмена
  1. function myPostAddCallBack($p_event, &$p_header){
  2. IF ($p_header['status'] == 'ok')  // ----- проверяем удачное добавление
  3.    unlink($p_header['filename']); // ----- удаляем файлы
  4. }
  5.  require_once("pclzip.lib.php");
  6. $archive = new PclZip($path.$archiveName);
  7. $unarc=($fileList=$archive->create($path.$folder,
  8.                 PCLZIP_OPT_REMOVE_PATH,$path,
  9.                 PCLZIP_CB_POST_ADD, myPostAddCallBack));
  10.  
  11. if ($dh = opendir($path.$folder)) {
  12.  closedir($dh);
  13.     }
  14. IF(file_exists($path.$archiveName)) rmdir($path.$folder); //-- если архив создан удаляем папку
  15.  

Все заработало. только не понятно почему

(Отредактировано автором: 17 Февраля, 2010 - 12:47:19)

 
 Top
Champion Супермодератор
Отправлено: 17 Февраля, 2010 - 12:47:51
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




подумай. Только я не говорил добавть opendir, я совсем другое сказал. Хотя это другое ты тоже кое-как сделал.
 
 Top
leshiy_SV
Отправлено: 17 Февраля, 2010 - 12:52:13
Post Id



Гость


Покинул форум
Сообщений всего: 77
Дата рег-ции: Окт. 2009  
Откуда: Пятигорск


Помог: 0 раз(а)




Champion пишет:
Хотя это другое ты тоже кое-как сделал.
Я как надо правильно? просто уже ума не приложу. а opendir просто так кусочек воткнул и решил проверить работу скрипт.
никаких изменений о рабочем каталоге я не делал. код представленный здесь это и есть весь код. больше нет ничего.
(Добавление)
После долгих размышлений. решил залезть в саму библиотеку pclzip.lib.php (использовал версию v.2.3) и посмотреть что где и почем. как говориться "Спасение утопающих — дело рук самих утопающих".
Вот что обнаружил, в блоке где идет открытие директории для считывание файлов есть строка $p_hdir = @opendir($p_filename), но закрывающей дескриптор этого каталога нигде не нашел, вместо это было просто unset($p_hdir); что походу не есть правильно. После того как я туда добавил closedir($p_hdir); Свершилось чудо и скрипт мой изначальный заработал Радость
Вот так

(Отредактировано автором: 17 Февраля, 2010 - 13:36:32)

 
 Top
Champion Супермодератор
Отправлено: 17 Февраля, 2010 - 13:46:14
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




leshiy_SV пишет:
Вот что обнаружил, в блоке где идет открытие директории для считывание файлов есть строка $p_hdir = @opendir($p_filename), но закрывающей дескриптор этого каталога нигде не нашел,
вооо, об этом и была речь. Молодец.
 
 Top
JustUserR
Отправлено: 17 Февраля, 2010 - 17:18:36
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




leshiy_SV Кстати на будущее проблема могла быть также в том что ваша функция архивирования могла изменять текущий каталог а при использовавнии функции rmdir и относительных путей данный каталог относительного нового базового положения мог и не существовать или быть недоступен
Еще может быть дело в реальном несовпадении прав доступа когда один CGI-скрипт работает от имени apache а другой нет - в таком случае надо либо использовать общую группу прав либо запусктать с битом setuid эффективного пользователя Улыбка


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB