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

Sco*_*t B 610 php directory wordpress

我遇到了一些使用Bluehost安装WordPress的案例,我遇到了WordPress主题的错误,因为上传文件夹wp-content/uploads不存在.

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

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

Gum*_*mbo 1168

试试这个:

if (!file_exists('path/to/directory')) {
    mkdir('path/to/directory', 0777, true);
}
Run Code Online (Sandbox Code Playgroud)

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

  • is_dir()比file_exists()快一点 (109认同)
  • @YuryPliashkou也许,但是如果已经有一个带有该名称的*文件*它就不起作用. (37认同)
  • 你错过了"递归"的旗帜 - 见萨蒂什的回答. (9认同)
  • `file_exists` - 检查文件或目录是否存在`is_file` - 判断文件名是否是常规文件`is_dir` - 判断文件名是否是目录 (8认同)
  • 这里有问题:所以如果在path/to中有一个名为'directory'的文件,is_dir会返回true,但是file_exists会返回false吗? (4认同)
  • 如果您创建文件夹而不是文件,我认为没有必要使用`file_exists`.它也可能是一个坏主意,因为没有理由不拥有一个文件和一个同名的文件夹.然后可以通过文件阻止创建文件夹. (3认同)
  • @IgorLacik 不,`file_exists` 也会返回 true。 (2认同)
  • 0777 权限允许每个人访问/读/写该目录。这不是我们想要的 Web 服务器中的上传目录。$path_to_directory = '路径/到/目录'; if (!file_exists($path_to_directory) && !is_dir($path_to_directory)) { mkdir($path_to_directory, 0644, true); } 0644 是上传目录的正确权限,因为我们通常不希望在服务器上执行上传。true 是第三个参数,用于将递归属性设置为 true 或 false。它允许创建路径名中指定的嵌套目录。 (2认同)

Sat*_*ave 127

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

mkdir('path/to/directory', 0755, true);
Run Code Online (Sandbox Code Playgroud)

  • 'recursive'标志是布尔第三个参数`true` (7认同)

pha*_*zei 64

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

/** 
 * 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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


And*_*Dog 56

那个辅助函数怎么样:

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

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

一个更好的选择是这个(不应该发出任何警告):

function makeDir($path)
{
     return is_dir($path) || mkdir($path);
}
Run Code Online (Sandbox Code Playgroud)

  • 如果删除`@`并用适当的`is_dir`检查替换它,我的upvote就是你的:)奖励点用于检查父目录`is_writable()`是否为防水辅助函数. (4认同)

Ely*_*yor 26

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

if (!is_dir('path/to/directory')) {
    mkdir('path/to/directory', 0777, true);
}
Run Code Online (Sandbox Code Playgroud)


use*_*ser 23

递归创建目录路径:

function makedirs($dirpath, $mode=0777) {
    return is_dir($dirpath) || mkdir($dirpath, $mode, true);
}
Run Code Online (Sandbox Code Playgroud)

受Python的启发 os.makedirs()


Tre*_*lls 10

在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;
}
Run Code Online (Sandbox Code Playgroud)


WP *_*unk 9

最好wp_mkdir_p为它使用函数。此函数将递归地创建一个具有正确权限的文件夹。此外,您可以跳过文件夹存在条件,因为它将在创建之前进行检查。

$path = 'path/to/directory';
if ( wp_mkdir_p( $path ) ) {
    // Directory exists or was created.
}
Run Code Online (Sandbox Code Playgroud)

更多:https : //developer.wordpress.org/reference/functions/wp_mkdir_p/

  • 值得一提的是,如果目录已经存在,`wp_mkdir_p()` 也会返回 true,所以你不需要任何额外的 `file_exists()` 检查。此外,它会尽力设置适当的目录权限。我总是会使用这个功能,而不是重新发明轮子。 (3认同)

Pro*_*wer 6

对于登录站点,我需要相同的内容。我需要用两个变量创建一个目录。$ directory是我要使用用户许可证号创建另一个子文件夹的主文件夹。

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);
}
Run Code Online (Sandbox Code Playgroud)


And*_*eas 6

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

if (!is_dir('path/to/directory')) {
    mkdir('path/to/directory');
}
Run Code Online (Sandbox Code Playgroud)