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
Форумы портала PHP.SU :: Версия для печати :: создание директорий
Форумы портала PHP.SU » PHP » Программирование на PHP » создание директорий

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

1. leshiy_SV - 12 Февраля, 2010 - 11:24:15 - перейти к сообщению
вот хочу написать кусочек для автоматического создания директорий (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 ну и если надо то уже прибавлять приставку. правда как считать названия только директории, а не файлов,с этим загвоздка.
2. Мелкий - 12 Февраля, 2010 - 11:56:07 - перейти к сообщению
PHP версии 5.3.х? ;)
http://php.su/php/?migration53
3. Champion - 12 Февраля, 2010 - 12:04:15 - перейти к сообщению
Это просто предупреждение, что пора отвыкать от этой функции. Можешь их отключить. Но отвыкать правда пора)
4. Мелкий - 12 Февраля, 2010 - 12:31:54 - перейти к сообщению
leshiy_SV пишет:
и такой вопрос: правильно ли так делать

Вот тут хорошая реализация была:
http://forum.php.su/topic.php?fo...27007#1263027007
Немного поправить под ваши потребности нужно только
и дальше пара сообщений ещё.
5. JustUserR - 12 Февраля, 2010 - 19:29:12 - перейти к сообщению
leshiy_SV пишет:
Выдает предупреждение
Лучше был сделали через PRCE по шаблону s/\/(.*?)$/$1+1/egs - то есть проверяетя есть ли такая директория и если есть то придавляется единица к ее номеру
И хорошо бы добавить проверку на наличие общего пути - то есть сделать рекурсивное создание Улыбка
6. PeleWin - 12 Февраля, 2010 - 21:29:08 - перейти к сообщению
Можно отказаться от использования регулярных выражений, что, может быть, незначительно ускорит работу скрипта. Я бы внёс такие небольшие изменения:
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'.
7. leshiy_SV - 13 Февраля, 2010 - 09:39:34 - перейти к сообщению
Я воспользовался советом Мелкого
Мелкий пишет:
Вот тут хорошая реализация была:
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.  
8. JustUserR - 13 Февраля, 2010 - 13:12:03 - перейти к сообщению
PeleWin пишет:
Можно отказаться от использования регулярных выражений, что, может быть, незначительно ускорит работу скрипта
С одной стороны ваш вариант быстрее тем что не использует регулярные вывражения - но с другой стороны пускай уже имеются папки типа folder_99999 и в тамом случае ваш PHP-скрипт будет перебирать и проверять все 100000 папок что займет много времени - в таком случае оптимальнее взять список папок например ls -la и grep-ом из него на основе регулярного выражения выдернуть папку с самым большим номером Улыбка
9. leshiy_SV - 13 Февраля, 2010 - 13:48:57 - перейти к сообщению
А что можно сказать про мой вариант постом выше?
10. JustUserR - 13 Февраля, 2010 - 13:57:23 - перейти к сообщению
leshiy_SV пишет:
А что можно сказать про мой вариант постом выше?
В принципе неплохой вариант как раз реализиующий идею для множества папок Улыбка
11. leshiy_SV - 13 Февраля, 2010 - 13:59:15 - перейти к сообщению
Единственное что в реале у меня $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.  

Как такой вариант? что знающие люди скажут
12. JustUserR - 14 Февраля, 2010 - 11:22:41 - перейти к сообщению
leshiy_SV пишет:
А можно об этом по подробнее. потому как столкнулся с проблемой, в том что если одну или несколько из папок удалить( теб которые в середине списка), то тут проявляются косяки. Получается что общее количество папок меньше чем номер последней папки. и тогда создающаяся папка уже существует
В том то и дело что надо искать не количетсво папок с аналогичным именем а номер последней папки - а если вас интересует чтобы пробелов между номерами папок не было то искать номер последней папки до пробела
Самый простой вариант решения это сделать readdir для папки и с помощью регулярного выражения типа m/\/(.*?)_(.*?)$/is в переменной $2 получать номер папки - а далее искать либо максимальную либо первый пробел в нумерации
13. leshiy_SV - 15 Февраля, 2010 - 08:51:25 - перейти к сообщению
Однако а можно на каком нибудь примере это показать?

Если я правильно понял то вроде бы так:
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. }
14. JustUserR - 15 Февраля, 2010 - 12:29:34 - перейти к сообщению
leshiy_SV пишет:
А можно на каком нибудь примере это показать?
Если я правильно понял то вроде бы так
В принципе вы привели верный пример только я бы заменил жадный квантификатор (\d*) на его нежадный аналог (\d*?) - чтобы если в имени папки были еще знаки подчеркивания с цифры он бы их не считал
А в остальном все хорошо Улыбка
15. leshiy_SV - 15 Февраля, 2010 - 12:32:07 - перейти к сообщению
Ха-ха Спасибо

 

Powered by ExBB FM 1.0 RC1