问题描述
我遇到了几个情况,WordPress 安装与 Bluehost,我遇到错误与我的 WordPress 主题,因为上传文件夹 wp-content/uploads
不存在。
显然,Bluehost cPanel WP 安装程序不会创建此文件夹,尽管 HostGator 。
所以我需要添加代码到我的主题检查文件夹,否则创建它。
最佳解决方案
尝试这个:
if (!file_exists('path/to/directory')) {
mkdir('path/to/directory', 0777, true);
}
请注意,0777
已经是目录的默认模式,并且可能仍然被当前的 umask 修改。
次佳解决方案
这是丢失的一块。你需要在 mkdir 调用中将’recursive’ 标志作为第三个参数 (布尔值为 true),如下所示:
mkdir('path/to/directory', 0755, true);
第三种解决方案
有一些比较普遍的东西,因为它出现在谷歌。虽然细节更具体,但这个问题的标题更为普遍。
/**
* 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 。
可以通过提供一个停止级别进行改进,因此如果超出用户文件夹或某些内容并通过包括权限,它将失败。
第四种方案
这样的帮助函数呢?
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);
}
第五种方案
递归创建目录路径:
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', 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;
}
第八种方案
我需要一个登录网站相同的东西。我需要创建一个带有两个变量的目录。 $目录是我要用用户许可证编号创建另一个 sub-folder 的主文件夹。
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);
}
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。