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

时间:2010-02-20 19:26:10

标签: php wordpress directory

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

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

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

19 个答案:

答案 0 :(得分:1113)

试试这个:

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

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

答案 1 :(得分:120)

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

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

答案 2 :(得分:61)

因为这出现在谷歌上,所以更具普遍性。虽然细节更具体,但这个问题的标题更为普遍。

/** 
 * 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。

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

答案 3 :(得分:53)

这样的辅助函数怎么样:

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

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

更好替代方案是这个(不应该发出任何警告):

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

答案 4 :(得分:23)

创建文件夹的更快捷方式:

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

答案 5 :(得分:21)

递归创建目录路径:

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

受到Python os.makedirs()

的启发

答案 6 :(得分:7)

在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;
}

答案 7 :(得分:4)

登录网站我需要同样的东西。我需要创建一个包含两个变量的目录。 $ 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);
}

答案 8 :(得分:4)

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

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

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

答案 9 :(得分:2)

对于您关于 WordPress 的具体问题,请使用以下代码:

if (!is_dir(ABSPATH . 'wp-content/uploads')) wp_mkdir_p(ABSPATH . 'wp-content/uploads');

函数参考:WordPress wp_mkdir_pABSPATH 是返回 WordPress 工作目录路径的常量。

还有另一个名为 wp_upload_dir() 的 WordPress 函数。它返回上传目录路径,如果不存在则创建一个文件夹。

$upload_path = wp_upload_dir();

以下代码适用于PHP 通用

if (!is_dir('path/to/directory')) mkdir('path/to/directory', 0777, true);

函数参考:PHP is_dir()

答案 10 :(得分:2)

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

if (!is_dir('path/to/directory')) {
    mkdir('path/to/directory');
}

答案 11 :(得分:1)

您首先需要检查目录是否存在file_exists('path_to_directory')

然后使用mkdir(path_to_directory)创建目录

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

有关mkdir() here

的更多信息

完整代码在这里:

$structure = './depth1/depth2/depth3/';
if (!file_exists($structure)) {
    mkdir($structure);
}

答案 12 :(得分:0)

您也可以尝试:

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

答案 13 :(得分:0)

如果文件夹不存在则创建文件夹

考虑问题的环境。

  • WordPress的。
  • 网站主办服务器。
  • 假设它的Linux不是运行PHP的Windows。

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

  

bool mkdir(字符串$ pathname [,int $ mode = 0777 [,bool $ recursive =   FALSE [,资源$ context]]])

手动说明唯一需要的参数是$pathname

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

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

说明:

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

  • 该命令将创建具有0755权限的文件夹(共享主机文件夹的默认权限)或0777命令的默认权限。
  • 运行PHP的Windows主机时会忽略
  • mode
  • 如果文件夹存在,mkdir命令已经在checker中构建;所以我们需要检查返回只有True | False;并且它不是错误,仅为警告,默认情况下在托管服务器中禁用警告。
  • 根据速度,如果禁用警告,则速度会更快。

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

在PHP7,Production Server,Linux上进行了测试

答案 14 :(得分:0)

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

答案 15 :(得分:0)

我们应该始终对我们的代码进行模块化,并且我在下面编写了相同的检查代码... 我们首先检查目录,如果目录不存在,则创建目录。

$boolDirPresents = $this->CheckDir($DirectoryName);

if (!$boolDirPresents) {
        $boolCreateDirectory = $this->CreateDirectory($DirectoryName);
        if ($boolCreateDirectory) {
        echo "Created successfully";
      }
  }

function CheckDir($DirName) {
    if (file_exists($DirName)) {
        echo "Dir Exists<br>";
        return true;
    } else {
        echo "Dir Not Absent<br>";
        return false;
    }
}

function CreateDirectory($DirName) {
    if (mkdir($DirName, 0777)) {
        return true;
    } else {
        return false;
    }
}

答案 16 :(得分:0)

如果您想避免遇到file_exists VS is_dir问题,建议您看看here

我尝试了此操作,并且仅在该目录不存在时创建目录。它不在乎是否有该名称的文件。

/* Creates the directory if it does not exist */
$path_to_directory = 'path/to/directory';
if (!file_exists($path_to_directory) && !is_dir($path_to_directory)) {
    mkdir($path_to_directory, 0777, true);
}

答案 17 :(得分:0)

作为当前解决方案的补充,是一种实用程序功能。

function createDir($path, $mode = 0777, $recursive = true) {
  if(file_exists($path)) return true;
  return mkdir($path, $mode, $recursive);
}

createDir('path/to/directory');

如果已经存在或成功创建,它将返回true。否则返回false。

答案 18 :(得分:0)

if (!is_dir('path_directory')) {
    @mkdir('path_directory');
}