【问题标题】:PHP mkdir( $recursive = true ) skips last directoryPHP mkdir( $recursive = true ) 跳过最后一个目录
【发布时间】:2010-11-26 19:36:35
【问题描述】:

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

mkdir( $path, 0777, true );

当我输入如下路径时:

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

除了最后一个之外的所有目录都已创建... 当我添加另一个目录时:

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

同样,除了最后一条之外,所有路径都已创建...

尝试了使用和不使用斜杠

请问有哪位能告诉我吗?

【问题讨论】:

  • 请发布您正在使用的 PHP 的确切版本。另外,您的主机是否启用了安全模式?
  • 您的 error_reporting 级别是多少?如果出现问题,则会引发 E_WARNING。安全模式已关闭,但您的 php 版本是否包含类似 suhosin 的内容?您是如何(以及从哪里)安装 php 的?从“香草” php.net 来源编译?通过您的发行版的包管理器(它是哪一个,包的确切名称是什么)?函数 php_plain_files_mkdir()(负责 php 函数 mkdir(x,y,true))已经有一段时间没有改变了,我在bugs.php.net 没有找到相关的错误
  • 所以,让我总结一下:问题是“递归 mkdir 无法正常工作”,答案是“哦,天哪,我犯了一个错误,在代码后面删除了目录”。然后我真的很想知道为什么这个用户有 26 票赞成这个有价值的信息?我不认为其他 14 个人有同样的问题......

标签: php recursion path filesystems mkdir


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    Like : 如果你想创建像
    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;
        }
    }
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        无论如何,经验教训......

        【讨论】:

          【解决方案5】:

          您的 PHP 版本是多少?是否开启了安全模式?

          如果是这样,那么可能是您遇到http://bugs.php.net/bug.php?id=43276

          【讨论】:

          • 5.2.4 没有安全模式,所以它不适用,我也试过有和没有斜杠所以......
          【解决方案6】:

          如果您尝试了所有方法但仍然无法正常工作,请在路径末尾添加一些文本,例如:

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

          【讨论】:

          • 这就是我在当前代码中“解决”它的方式......但这并没有任何意义......
          • 这是一个肮脏的变通办法,对所提出的问题没有帮助...> 有没有人可以在这里启发我?
          • @Sophomore - 用什么启发你?
          • @Andre - 完全同意。否则可能会触发副作用。
          • 我同意这是一种变通方法,但是他说他测试了人们已经发布的解决方案
          【解决方案7】:

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

          至少在mkdir 文档的示例中是这样使用的。

          我个人不记得有问题,但我通常不附加斜杠,所以去试试吧。

          更新

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

          这是我使用的代码:

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

          对不起,我好像帮不上忙了。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-02-10
            • 2023-03-09
            • 1970-01-01
            • 2011-11-27
            • 2018-09-07
            • 1970-01-01
            • 2012-09-21
            • 2016-11-19
            相关资源
            最近更新 更多