PHP mkdir($recursive = true) пропускает последний каталог

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

mkdir( $path, 0777, true );

когда я ввожу путь, например:

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

создаются все каталоги, кроме последнего... когда я добавляю другой каталог, например:

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

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

пробовал как с косой чертой, так и без нее

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


person NDM    schedule 09.09.2009    source источник
comment
Пожалуйста, укажите точную версию PHP, которую вы используете. Кроме того, ваш хост работает с включенным safe_mode?   -  person Ian Kemp    schedule 09.09.2009
comment
Какой у вас уровень error_reporting? Если что-то пойдет не так, выдается E_WARNING. безопасный режим отключен, но есть ли в вашей версии php что-то вроде сухосина? Как (и откуда) вы установили php? Скомпилировано из исходников vanilla php.net? Через диспетчер пакетов вашего дистрибутива (какой именно и каково точное имя пакета)? Функция php_plain_files_mkdir() (отвечающая за php-функцию mkdir(x,y,true)) давно не менялась, и я не нашел связанной ошибки в bugs.php.net   -  person VolkerK    schedule 09.09.2009
comment
Итак, подытожу: вопрос рекурсивный, mkdir не работает должным образом, а ответ — о боже, я сделал ошибку и удалил каталог позже в коде. Тогда мне действительно интересно, почему этот пользователь получил 26 голосов за эту ценную информацию? Я не думаю, что у 14 других людей была такая же проблема...   -  person rob74    schedule 08.03.2018


Ответы (7)


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

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

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

Как бы то ни было, урок усвоен...

person NDM    schedule 23.09.2009

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

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

Лично я не помню, чтобы у меня были проблемы, но обычно я не добавляю косую черту в конце, так что иди и попробуй.

ОБНОВЛЕНИЕ:

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

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

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

Извините, похоже, я здесь не помощник.

person André Hoffmann    schedule 09.09.2009

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

$path = '/path/to/create/recur/ively/more/this_wont_be_created_anyway';
person w35l3y    schedule 09.09.2009
comment
Вот как я "решил" это в текущем коде... Но на самом деле это не имеет никакого смысла... - person NDM; 09.09.2009
comment
это грязный обходной путь и не помогает заданному вопросу ... Может ли кто-нибудь просветить меня здесь, пожалуйста? - person Gnark; 09.09.2009
comment
@Второкурсник - чем тебя просветить? - person mauris; 09.09.2009
comment
@Андре - полностью согласен. иначе побочные эффекты могут просто сработать. - person mauris; 09.09.2009
comment
Я согласен, что это обходной путь, но он сказал, что тестировал решения, которые люди уже опубликовали. - person w35l3y; 09.09.2009

Какая у вас версия PHP? Safe_mode включен?

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

person Anti Veeranna    schedule 09.09.2009
comment
5.2.4 без safe_mode, так что это неприменимо, я также пробовал с косой чертой и без нее, так что.... - person NDM; 09.09.2009

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

umask(0777);
mkdir($path, 0777, true);
person Faruk Omar    schedule 15.01.2015

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

Например: Если вы хотите создать структуру каталогов, например
organizations / 1 / users / 1 /

Таким образом, вам нужно вызвать эту функцию только с путем к каталогам, например
$directories_path = 'organizations/1/users/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;
    }
}
person Ajay Patidar    schedule 20.06.2016

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

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

mkdir( $path, 0777, true ); // GOOD - creates /a/b/c/d
person Joseph Lust    schedule 26.06.2017