PHP mkdir ($ recursive = true) пропускает последний каталог
У меня есть следующий код на сервере Linux 5.2.4 (без safe_mode):
mkdir( $path, 0777, true );
когда я ввожу путь следующим образом:
'/path/to/create/recur/ively/'
создаются все каталоги, за исключением последнего...
когда я добавляю другой каталог, например:
'/path/to/create/recur/ively/more/'
все пути создаются за исключением последнего...
попробовали как с завершающими косыми чертами, так и без них
Может ли кто-нибудь просветить меня здесь, пожалуйста?
Ответы
Ответ 1
Хорошо, решения следующие: проблем не было.
Я не тестировал код изолированно, но предполагал, что следующий код ничего не делает для структуры каталогов...
поскольку я узнал, что каталог был удален позже с помощью самого кода.
В любом случае, извлеченный урок...
Ответ 2
Попробуйте удалить конечную косую черту с вашего пути.
По крайней мере, как это используется в примерах документации mkdir
.
Лично я не могу вспомнить о проблемах, но я обычно не добавляю трейлинг-косые черты, поэтому идите и попробуйте это.
UPDATE
Я просто попробовал свой код и создал каждый каталог, включая последний.
Я запускаю Mac OS X 10.5. Не знаю, почему это не работает для вас: - (
Что я использовал код:
<?php
$path = '/Users/andre/test/bla/foo';
mkdir( $path, 0777, true );
Извините, похоже, что я здесь не помогаю.
Ответ 3
Если вы все пробовали, и он не работает, добавьте текст в конец пути, например:
$path = '/path/to/create/recur/ively/more/this_wont_be_created_anyway';
Ответ 4
Какова ваша версия PHP? Включен ли safe_mode?
Если это так, то может случиться, что вы испытываете http://bugs.php.net/bug.php?id=43276
Ответ 5
Созданные промежуточные каталоги устанавливаются на основе текущего umask. Вы хотите что-то вроде этого
umask(0777);
mkdir($path, 0777, true);
Ответ 6
Функция, которая создает все каталоги (папки) заданного пути. Не нужно писать код, создавайте все каталоги (папки) заданного пути. он создаст все каталоги (папки).
Вроде: Если вы хотите создать структуру каталогов, например,
организации/1/пользователи/1/
Поэтому вам нужно только вызвать эту функцию с помощью пути к каталогам, например,
$directories_path = 'организации/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;
}
}
Ответ 7
Вы получите эту ошибку, если сделаете глупую ошибку, которую я сделал, и передайте строку, а не числовой литерал для режима.
mkdir( $path, "0777", true ); // BAD - only creates /a/b
mkdir( $path, 0777, true ); // GOOD - creates /a/b/c/d