代码之家  ›  专栏  ›  技术社区  ›  NDM

php mkdir($recursive=true)跳过最后一个目录

  •  13
  • NDM  · 技术社区  · 16 年前

    我在php 5.2.4(无安全模式)Linux服务器上有以下代码:

    mkdir( $path, 0777, true );
    

    当我输入如下路径时:

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

    除最后一个目录外,所有目录都已创建… 当我添加另一个目录时,如:

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

    同样,除了最后一个路径外,所有路径都被创建…

    已经尝试了有和没有尾随斜杠

    有人能给我开导一下吗?

    7 回复  |  直到 8 年前
        1
  •  14
  •   NDM    16 年前

    好的,解决方法如下:没问题。

    我没有单独测试代码,只是假设下面的代码没有对目录结构做任何操作…

    后来我发现这个目录被代码本身删除了。

    总之,经验教训…

        2
  •  8
  •   André Hoffmann    16 年前

    尝试从路径中删除尾随斜杠。

    至少这就是它在 mkdir 文档。

    我个人不记得有什么问题,但我通常不会附加尾随斜杠,所以去试试看。

    更新 :

    我刚试过你的代码,它创建了每个目录,包括最后一个目录。 我在运行Mac OS X 10.5。不知道为什么它不适合你:-(

    这就是我使用的代码:

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

    对不起,我好像帮不了什么忙。

        3
  •  2
  •   w35l3y    16 年前

    如果您尝试了所有操作,但它仍然不工作,那么在路径的末尾添加一些文本,如:

    $path = '/path/to/create/recur/ively/more/this_wont_be_created_anyway';
    
        4
  •  1
  •   Anti Veeranna    16 年前

    你的PHP版本是什么?安全模式是否打开?

    如果是这样,那么可能是你正在经历 http://bugs.php.net/bug.php?id=43276

        5
  •  1
  •   Faruk Omar    10 年前

    创建的中间目录是基于当前umask设置的。你想要这样的东西

    umask(0777);
    mkdir($path, 0777, true);
    
        6
  •  0
  •   Ajay Patidar    9 年前

    创建给定路径的所有目录(文件夹)的函数。无需编写代码,创建给定路径的每个目录(文件夹)。它将创建所有目录(文件夹)。

    like:如果您想创建目录结构like
    组织/1/用户/1/

    所以您只需要使用如下目录路径调用这个函数
    $directories_path='组织/1/用户/1/';
    创建上载目录($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
  •  0
  •   Joseph Lust    8 年前

    如果你犯了我犯的愚蠢的错误并传递了一个字符串,而不是模式的数字文本,你会得到这个错误。

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