首页 文章

如果文件夹尚不存在,请创建该文件夹

提问于
浏览
536

我've run into a few cases with WordPress installs with Bluehost where I'已经遇到我的WordPress主题错误,因为上传文件夹 wp-content/uploads 不存在 .

显然,Bluehost cPanel WP安装程序不会创建此文件夹,但HostGator会这样做 .

所以我需要在我的主题中添加代码来检查文件夹并以其他方式创建它 .

13 回答

  • 0

    这是缺失的部分 . 你需要在mkdir调用中传递'recursive'标志作为第三个参数(布尔值为true),如下所示:

    mkdir('path/to/directory', 0755, true);
    
  • 3

    试试这个:

    if (!file_exists('path/to/directory')) {
        mkdir('path/to/directory', 0777, true);
    }
    

    请注意, 0777 已经是目录的默认模式,可能仍会被当前的umask修改 .

  • 50

    因为这出现在谷歌上的东西更普遍 . 虽然细节更具体,但这个问题的 Headers 更为普遍 .

    /** 
     * recursively create a long directory path
     */
    function createPath($path) {
        if (is_dir($path)) return true;
        $prev_path = substr($path, 0, strrpos($path, '/', -2) + 1 );
        $return = createPath($prev_path);
        return ($return && is_writable($prev_path)) ? mkdir($path) : false;
    }
    

    这将采用一条路径,可能带有一长串未创建的目录,并继续向上移动一个目录,直到它到达现有目录 . 然后它将尝试在该目录中创建下一个目录,并继续直到它创建了所有目录 . 如果成功则返回true .

    可以通过提供一个停止级别来改进它,如果超出用户文件夹或其他东西并通过包含权限它就会失败 .

  • 20

    那个辅助函数怎么样:

    function makeDir($path)
    {
         $ret = mkdir($path); // use @mkdir if you want to suppress warnings/errors
         return $ret === true || is_dir($path);
    }
    

    如果目录已成功创建或已存在,它将返回 true ,如果无法创建目录,则返回 false .

    一个 better 替代方案就是这个(不应该发出任何警告):

    function makeDir($path)
    {
         return is_dir($path) || mkdir($path);
    }
    
  • 21

    递归创建目录路径:

    function makedirs($dirpath, $mode=0777) {
        return is_dir($dirpath) || mkdir($dirpath, $mode, true);
    }
    

    灵感来自Python的os.makedirs()

  • 7

    更快的创建文件夹的方法:

    if (!is_dir('path/to/directory')) {
        mkdir('path/to/directory', 0777, true);
    }
    
  • 0

    在WordPress中还有非常方便的函数wp_mkdir_p,它将以递归方式创建目录结构 .

    参考资料来源: -

    function wp_mkdir_p( $target ) {
        $wrapper = null;
    
        // strip the protocol
        if( wp_is_stream( $target ) ) {
            list( $wrapper, $target ) = explode( '://', $target, 2 );
        }
    
        // from php.net/mkdir user contributed notes
        $target = str_replace( '//', '/', $target );
    
        // put the wrapper back on the target
        if( $wrapper !== null ) {
            $target = $wrapper . '://' . $target;
        }
    
        // safe mode fails with a trailing slash under certain PHP versions.
        $target = rtrim($target, '/'); // Use rtrim() instead of untrailingslashit to avoid formatting.php dependency.
        if ( empty($target) )
            $target = '/';
    
        if ( file_exists( $target ) )
            return @is_dir( $target );
    
        // We need to find the permissions of the parent folder that exists and inherit that.
        $target_parent = dirname( $target );
        while ( '.' != $target_parent && ! is_dir( $target_parent ) ) {
            $target_parent = dirname( $target_parent );
        }
    
        // Get the permission bits.
        if ( $stat = @stat( $target_parent ) ) {
            $dir_perms = $stat['mode'] & 0007777;
        } else {
            $dir_perms = 0777;
        }
    
        if ( @mkdir( $target, $dir_perms, true ) ) {
    
            // If a umask is set that modifies $dir_perms, we'll have to re-set the $dir_perms correctly with chmod()
            if ( $dir_perms != ( $dir_perms & ~umask() ) ) {
                $folder_parts = explode( '/', substr( $target, strlen( $target_parent ) + 1 ) );
                for ( $i = 1; $i <= count( $folder_parts ); $i++ ) {
                    @chmod( $target_parent . '/' . implode( '/', array_slice( $folder_parts, 0, $i ) ), $dir_perms );
                }
            }
    
            return true;
        }
    
        return false;
    }
    
  • 112

    我对登录站点需要相同的东西 . 我需要创建一个包含两个变量的目录 . $目录是我想要用用户许可证号创建另一个子文件夹的主文件夹 .

    include_once("../include/session.php");
    $lnum = $session->lnum; //Users license number from sessions
    $directory = uploaded_labels; // Name of directory that folder is being created in
    
    if (!file_exists($directory."/".$lnum)) {
    mkdir($directory."/".$lnum, 0777, true);
    }
    
  • 1039

    这是没有错误抑制的最新解决方案:

    if (!is_dir('path/to/directory')) {
        mkdir('path/to/directory');
    }
    
  • 1
    if (!is_dir('path_directory')) {
        @mkdir('path_directory');
    }
    
  • 59

    你也可以尝试:

    $dirpath = "path/to/dir";
    $mode = "0777";
    is_dir($dirpath) || mkdir($dirpath, $mode, true);
    
  • 0

    如果文件夹尚不存在,则创建该文件夹

    考虑问题的环境 .

    • WordPress .

    • Webhosting Server .

    • 假设它的Linux不是运行PHP的Windows .

    引用自:http://php.net/manual/en/function.mkdir.php

    bool mkdir(string $ pathname [,int $ mode = 0777 [,bool $ recursive = FALSE [,resource $ context]]])

    手册说,唯一需要的参数是 $pathname

    所以,我们可以简单地编码:

    <?php
    error_reporting(0); 
    if(!mkdir('wp-content/uploads')){
       // todo
    }
    ?>
    

    说明:

    除非需要,否则我们不必传递任何参数或检查文件夹是否存在,甚至传递模式参数;原因如下:

    • 该命令将创建具有0755权限的文件夹(默认共享主机文件夹's default permission) or 0777 the command') .
      Windows Hosting running PHP 上忽略

    • mode .

    • 如果文件夹存在, mkdir 命令已经在checker中构建;所以我们需要检查返回只有True | False;并且它不是错误,仅为警告,默认情况下在托管服务器中禁用警告 .

    • 根据速度,如果禁用警告,则速度会更快 .

    这只是另一种研究问题的方式,而不是声称更好或最优的解决方案 .

    在PHP7,Production Server,Linux上测试过

  • 0
    $upload = wp_upload_dir();
    $upload_dir = $upload['basedir'];
    $upload_dir = $upload_dir . '/newfolder';
    if (! is_dir($upload_dir)) {
       mkdir( $upload_dir, 0700 );
    }
    

相关问题