2009-09-09 3 views
12

У меня есть следующий фрагмент кода на PHP 5.2.4 (без safe_mode) Linux сервер:

mkdir($path, 0777, true); 

, когда я вхожу в путь:

'/path/to/create/recur/ively/' 

все каталоги созданы для последнего ... за исключением того, когда я добавить еще один каталог, как:

'/path/to/create/recur/ively/more/' 

снова, все пути созданы за исключением последнего ...

попытались с и без слешей

Может any1 просветить меня здесь, пожалуйста?

+0

Пожалуйста, разместите точную версию PHP, которую вы используете. Кроме того, включен ли ваш хост с включенным safe_mode? –

+0

Каков ваш уровень error_reporting? Если что-то пойдет не так, возникает E_WARNING. безопасный режим выключен, но ваша версия php содержит что-то вроде suhosin? Как (и откуда) вы установили php? Составлено из источников php.net «ванили»? Через ящик для вашего дистрибутива (какой именно он и какое именно имя пакета)? Функция php_plain_files_mkdir() (ответственная за php-функцию mkdir (x, y, true)) не изменилась довольно долго, и я не нашел связанную ошибку на http://bugs.php.net – VolkerK

+0

Итак, пусть я подытоживаю: вопрос в том, что «рекурсивный mkdir не работает должным образом», и ответ «о, я сделал ошибку и удалил каталог позже в коде». Тогда я действительно удивляюсь, почему у этого пользователя есть 26 upvotes для этой ценной информации? Я не думаю, что у 14 других людей была такая же проблема ... – rob74

ответ

14

Хорошо, решения следующие: проблем не было.

Я не проверял код в изоляции, но только предполагается, что следующий код не делает ничего в структуру каталогов ...

как я узнал каталог был удален позже самим кодом.

Во всяком случае, Урок ...

8

Попробуйте удалить конечную косую черту с вашего пути.

По крайней мере, так оно используется в примерах документации mkdir.

Лично я не могу вспомнить о проблемах, но я обычно не добавляю завершающие косые черты, поэтому иди и попробуй.

UPDATE:

Я просто попробовал ваш код и создается каждый каталог, включая последний. Я запускаю Mac OS X 10.5. Понятия не имею, почему это не работает для вас :-(

Вот код, который я использовал:

<?php 
$path = '/Users/andre/test/bla/foo'; 
mkdir($path, 0777, true); 

К сожалению, кажется, что я здесь не помогает

+0

Это было о первом, что я сделал, но он по-прежнему дает те же результаты ... – NDM

2

Если вы испробовали все, и это. продолжает не работать, а затем добавить некоторый текст в конце пути, как:

$path = '/path/to/create/recur/ively/more/this_wont_be_created_anyway'; 
+0

Вот как я «решил» его в текущем коде ... Но это на самом деле не имеет никакого смысла ... – NDM

+0

это грязный обход и не помогает задавать вопрос ... > Может ли any1 просветить меня здесь, пожалуйста? – Gnark

+1

Вы никогда не должны использовать код, который вы не понимаете. –

1

Что ваш PHP версии safe_mode включен

?

Если это так, то может случиться так, что вы испытываете http://bugs.php.net/bug.php?id=43276

+0

5.2.4 без safe_mode, поэтому он неприменим, я также пробовал с и без трейлинг-косая черта, поэтому .... – NDM

0

промежуточные каталоги, созданные устанавливаются на основе текущего UMASK. Вы хотите что-то вроде этого

umask(0777); 
mkdir($path, 0777, true); 
0

Функция, которая создает все каталоги (папки) данного пути. Не нужно писать код, создавайте все каталоги (папки) заданного пути. он создаст все каталоги (папки).

Как: Если вы хотите, чтобы создать структуру каталогов, как
организации/1/пользователей/1/

Так что вам нужно только вызвать эту функцию с пути каталогов, как
$ directories_path = «организаций/1/пользователей/1/';
createUploadDirectories ($ directories_path);

/* 
* Method Name : createUploadDirectories 
* Parameter : null 
* Task : Loading view for create directries for upload 
*/ 

if (! function_exists('createUploadDirectories')){ 
    function createUploadDirectories($upload_path=null){ 
     if($upload_path==null) return false; 
     $upload_directories = explode('/',$upload_path); 
     $createDirectory = array(); 
     foreach ($upload_directories as $upload_directory){ 
      $createDirectory[] = $upload_directory; 
      $createDirectoryPath = implode('/',$createDirectory); 
      if(!is_dir($createDirectoryPath)){ 
       $old = umask(0); 
       mkdir($createDirectoryPath,DIR_WRITE_MODE);// Create the folde if not exist and give permission 
       umask($old); 
      }    
     } 
     return true; 
    } 
} 
0

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

mkdir($path, "0777", true); // BAD - only creates /a/b 

mkdir($path, 0777, true); // GOOD - creates /a/b/c/d 
Смежные вопросы