PHP mkdir( $recursive = true ) skips last directory

百般思念 提交于 2020-01-01 08:35:21

问题


I've got the following piece of code on a PHP 5.2.4 (no safe_mode) linux server:

mkdir( $path, 0777, true );

when I enter a path like:

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

all directories are created except for the last one... when I add another directory like:

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

again, all paths are created except for the last one...

have tried both with and without trailing slashes

Can any1 enlighten me here please?


回答1:


Ok the solutions is as follows: there was no problem.

I did not test the code in isolation, but only assumed the following code was not doing anything to the directory structure...

as I found out the directory got deleted later on by the code itself.

Anyway, Lesson learned...




回答2:


Try to remove the trailing slash from your path.

At least that's how it's being used in the examples of the mkdir documentation.

Personally I can't remember having problems, but I usally don't append trailing slashes, so go and try that.

UPDATE:

I just tried your code and it created every directory including the last one. I'm running Mac OS X 10.5. No idea why it's not working for you :-(

That's the code I used:

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

Sorry, seems like I'm of no help here.




回答3:


If you tried everything and it keeps not working, then add some text in the end of the path like:

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



回答4:


What is your PHP version? Is safe_mode turned on?

If so, then it could be that you are experiencing http://bugs.php.net/bug.php?id=43276




回答5:


The intermediate directories created are set based on the current umask. You want something like this

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



回答6:


Function that create all directories (folders) of given path. No need to write code create each directories (folders) of given path. it will create all directories (folders).

Like : If you want to create directory structure like
organizations / 1 / users / 1 /

So you only need to call this function with directories path like
$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;
    }
}



回答7:


You'll get this error if you make the silly mistake I did and pass a string, rather than the numeric literal for mode.

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

mkdir( $path, 0777, true ); // GOOD - creates /a/b/c/d


来源:https://stackoverflow.com/questions/1399174/php-mkdir-recursive-true-skips-last-directory

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!