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 Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
leshiy_SV
Отправлено: 12 Февраля, 2010 - 11:24:15
Post Id



Гость


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


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




вот хочу написать кусочек для автоматического создания директорий (folder) в заданной директории (www/archiv/razdel). с учетом того, что если название, создающейся директории уже существует, к нему прибавлялась приставка _1, _2, и т.д. (folder_1, folder_2 ...) делаю так
PHP:
скопировать код в буфер обмена
  1.  
  2. $path="www/archiv/razdel/folder/";
  3. IF(file_exists($path)) {
  4.    $i=1;
  5. do{$path = ereg_replace("/$", "_$i", $path);
  6.      $i++;}
  7.    while(file_exists($path));
  8. }
  9. mkdir($path);
  10. echo "новая: ".$path;

выдает предупреждение:Deprecated: Function ereg_replace() is deprecated in index.php хотя и выводит правильный результат на первом этапе (folder_1), а потом бесконечно перебирает
и такой вопрос: правильно ли так делать или может так, считать в массив названия всех папок директории razdel, проверить в массиве директорию folder ну и если надо то уже прибавлять приставку. правда как считать названия только директории, а не файлов,с этим загвоздка.

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

 
 Top
Мелкий Супермодератор
Отправлено: 12 Февраля, 2010 - 11:56:07
Post Id



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


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


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




PHP версии 5.3.х? ;)
http://php.su/php/?migration53


-----
PostgreSQL DBA
 
 Top
Champion Супермодератор
Отправлено: 12 Февраля, 2010 - 12:04:15
Post Id



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


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


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




Это просто предупреждение, что пора отвыкать от этой функции. Можешь их отключить. Но отвыкать правда пора)
 
 Top
Мелкий Супермодератор
Отправлено: 12 Февраля, 2010 - 12:31:54
Post Id



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


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


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




leshiy_SV пишет:
и такой вопрос: правильно ли так делать

Вот тут хорошая реализация была:
http://forum.php.su/topic.php?fo...27007#1263027007
Немного поправить под ваши потребности нужно только
и дальше пара сообщений ещё.

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



-----
PostgreSQL DBA
 
 Top
JustUserR
Отправлено: 12 Февраля, 2010 - 19:29:12
Post Id



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


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


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




leshiy_SV пишет:
Выдает предупреждение
Лучше был сделали через PRCE по шаблону s/\/(.*?)$/$1+1/egs - то есть проверяетя есть ли такая директория и если есть то придавляется единица к ее номеру
И хорошо бы добавить проверку на наличие общего пути - то есть сделать рекурсивное создание Улыбка


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
PeleWin
Отправлено: 12 Февраля, 2010 - 21:29:08
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Февр. 2010  


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




Можно отказаться от использования регулярных выражений, что, может быть, незначительно ускорит работу скрипта. Я бы внёс такие небольшие изменения:
PHP:
скопировать код в буфер обмена
  1.  
  2. $path0 = "www/archiv/razdel/folder";
  3. $path = $path0 . '/'; //я не знаю, нужно ли добавлять завершающую косую черту, но в твоём варианте она была
  4. $i = 0;
  5. while (file_exists($path)) {
  6.   ++ $i;
  7.   $path = $path0 . $i .'/';
  8. }
  9. mkdir($path);
  10. echo "новая: ".$path;


P.S. бесконечный перебор в вашем скрипте - следствие того, что функция ereg_replace("/$", "_$i", 'www/archiv/razdel/folder1') вернёт неизменённое значение 'www/archiv/razdel/folder1'.
 
 Top
leshiy_SV
Отправлено: 13 Февраля, 2010 - 09:39:34
Post Id



Гость


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


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




Я воспользовался советом Мелкого
Мелкий пишет:
Вот тут хорошая реализация была:
http://forum.php.su/topic.php?fo...27007#1263027007

А именно из этого поста. По-моему наиболее простая реализация.
Вот что получилось.
PHP:
скопировать код в буфер обмена
  1.  
  2. IF(file_exists($path)){
  3.    $path="www/archiv/razdel/";
  4.    $folder="folder";
  5.  
  6.    IF(file_exists($path.$folder))  {
  7.       $f=count(glob("$path.$folder*", GLOB_ONLYDIR));
  8.       mkdir($path.$folder."_".$f);
  9.    }
  10.    ELSE mkdir($path.$folder);
  11. }
  12.  

(Отредактировано автором: 13 Февраля, 2010 - 14:24:43)

 
 Top
JustUserR
Отправлено: 13 Февраля, 2010 - 13:12:03
Post Id



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


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


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




PeleWin пишет:
Можно отказаться от использования регулярных выражений, что, может быть, незначительно ускорит работу скрипта
С одной стороны ваш вариант быстрее тем что не использует регулярные вывражения - но с другой стороны пускай уже имеются папки типа folder_99999 и в тамом случае ваш PHP-скрипт будет перебирать и проверять все 100000 папок что займет много времени - в таком случае оптимальнее взять список папок например ls -la и grep-ом из него на основе регулярного выражения выдернуть папку с самым большим номером Улыбка


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
leshiy_SV
Отправлено: 13 Февраля, 2010 - 13:48:57
Post Id



Гость


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


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




А что можно сказать про мой вариант постом выше?

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

 
 Top
JustUserR
Отправлено: 13 Февраля, 2010 - 13:57:23
Post Id



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


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


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




leshiy_SV пишет:
А что можно сказать про мой вариант постом выше?
В принципе неплохой вариант как раз реализиующий идею для множества папок Улыбка


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
leshiy_SV
Отправлено: 13 Февраля, 2010 - 13:59:15
Post Id



Гость


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


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




Единственное что в реале у меня $folder имеет на конце слэш "/"? т.е. например folder/. и как от него избавиться, самым простым способом, чтобы прибавить потом к нему "_$f" я не знаю. подскажите как тут решить проблему?
думаю использовать функцию
как раз выдает имя без слэша
(Добавление)
JustUserR пишет:
оптимальнее взять список папок например ls -la и grep-ом из него на основе регулярного выражения выдернуть папку с самым большим номером
А можно об этом по подробнее. потому как столкнулся с проблемой, в том что если одну или несколько из папок удалить( теб которые в середине списка), то тут проявляются косяки. Получается что общее количество папок меньше чем номер последней папки. и тогда создающаяся папка уже существует Не понял
(Добавление)
или сделать так
PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. IF(file_exists($path)){
  4.    $path="www/archiv/razdel/";
  5.    $folder="folder";
  6.      IF(file_exists($path.$folder))  {
  7.         $folders=glob("$path.$folder*", GLOB_ONLYDIR);
  8.         natsort($folders);   // сортируем массив, используя алгоритм "natural order"
  9.         $f=substr(array_pop($folders),7) + 1;
  10.         mkdir($path.$folder."_".$f);
  11.      }
  12.     ELSE mkdir($path.$folder);
  13. }
  14.  

Как такой вариант? что знающие люди скажут

(Отредактировано автором: 13 Февраля, 2010 - 14:54:26)

 
 Top
JustUserR
Отправлено: 14 Февраля, 2010 - 11:22:41
Post Id



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


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


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




leshiy_SV пишет:
А можно об этом по подробнее. потому как столкнулся с проблемой, в том что если одну или несколько из папок удалить( теб которые в середине списка), то тут проявляются косяки. Получается что общее количество папок меньше чем номер последней папки. и тогда создающаяся папка уже существует
В том то и дело что надо искать не количетсво папок с аналогичным именем а номер последней папки - а если вас интересует чтобы пробелов между номерами папок не было то искать номер последней папки до пробела
Самый простой вариант решения это сделать readdir для папки и с помощью регулярного выражения типа m/\/(.*?)_(.*?)$/is в переменной $2 получать номер папки - а далее искать либо максимальную либо первый пробел в нумерации


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
leshiy_SV
Отправлено: 15 Февраля, 2010 - 08:51:25
Post Id



Гость


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


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




Однако а можно на каком нибудь примере это показать?

Если я правильно понял то вроде бы так:
PHP:
скопировать код в буфер обмена
  1. $path="www/archiv/razdel/";
  2. $folder="folder";
  3. IF(file_exists($path.$folder)){
  4.   IF ($handle = opendir($path)) {
  5.      while (false !== ($file = readdir($handle))) {
  6.        IF(preg_match("/".$folder."_(\d*)$/is",$file, $found))
  7.            IF($found[1]>$f) $f=$found[1];
  8.      }
  9.       echo "MAX: $f";
  10.       closedir($handle);
  11.   }
  12. }

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

 
 Top
JustUserR
Отправлено: 15 Февраля, 2010 - 12:29:34
Post Id



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


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


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




leshiy_SV пишет:
А можно на каком нибудь примере это показать?
Если я правильно понял то вроде бы так
В принципе вы привели верный пример только я бы заменил жадный квантификатор (\d*) на его нежадный аналог (\d*?) - чтобы если в имени папки были еще знаки подчеркивания с цифры он бы их не считал
А в остальном все хорошо Улыбка


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
leshiy_SV
Отправлено: 15 Февраля, 2010 - 12:32:07
Post Id



Гость


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


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




Ха-ха Спасибо
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB