创建一个文件夹,如果它不存在

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

显然BluehostcPanel WordPress安装程序不会创建此文件夹,但HostGator会。

因此,我需要将代码添加到我的主题中,以检查文件夹并以其他方式创建它。

816520 次浏览

试试这个,使用mkdir

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

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

使用像这样的辅助函数:

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

这里有一些更普遍的东西,因为这是在谷歌上出现的。虽然细节更具体,但这个问题的标题更具普遍性。

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

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

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

mkdir('path/to/directory', 0755, true);
if (!is_dir('path_directory')) {
@mkdir('path_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);
}

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

递归创建目录路径:

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

灵感来自Python的os.makedirs()

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

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

您也可以尝试:

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

创建文件夹的更快方法:

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

创建一个文件夹,如果它不存在

考虑到问题的环境。

  • WordPress。
  • 虚拟主机服务器。
  • 假设它是Linux,而不是运行PHP的Windows。

引用自:mkdir

bool mkdir(string$路径名[, int$mode=0777[, bool$递归= FALSE[,资源 ]]] )

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

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

<?php
error_reporting(0);


if(!mkdir('wp-content/uploads')){
// Todo
}
?>

说明:

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

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

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

它在PHP 7、正式服和Linux上进行了测试

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

我们应该始终模块化我们的代码,我在下面写了同样的检查…

我们首先检查目录。如果目录不存在,我们创建目录。

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

如果你想避免file_exists vs.is_dir问题,我建议你看看这里

我尝试了这个,它只在该目录不存在时创建目录。它不关心是否有同名的文件。

/* 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);
}

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

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

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

更多关于mkdir()这里

完整代码在这里:

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

给你。

if (!is_dir('path/to/directory')) {
if (!mkdir('path/to/directory', 0777, true) && !is_dir('path/to/directory')) {
throw new \RuntimeException(sprintf('Directory "%s" was not created', 'path/to/directory'));
}
}

作为对当前解决方案的补充,实用函数。

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


createDir('path/to/directory');

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

最好的方法是使用wp_mkdir_p函数。此函数将递归创建一个带有正确的权限的文件夹。

此外,您可以跳过文件夹存在条件,因为函数返回:

  • true当目录创建或之前存在时
  • false如果您无法创建目录。

示例:

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

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

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

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

函数参考:WordPresswp_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);

功能参考:PHPis_dir()

我们可以使用mkdir创建文件夹。我们也可以为它设置权限。

Value Permission
0     cannot read, write or execute
1     can only execute
2     can only write
3     can write and execute
4     can only read
5     can read and execute
6     can read and write
7     can read, write and execute
<?PHP
  

// Making a directory with the provision
// of all permissions to the owner and
// the owner's user group
mkdir("/documents/post/", 0770, true)
  

?>