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

758
我在使用Bluehost安装WordPress时遇到了一些问题,因为上传文件夹wp-content/uploads不存在,导致我的WordPress主题出现错误。
显然,cPanel的WordPress安装程序没有创建这个文件夹,而HostGator则有。
因此,我需要在我的主题中添加代码来检查该文件夹是否存在,如果不存在则创建它。

17
如果('path/to/directory')目录不存在,就会创建一个名为'path/to/directory'的目录,并授予权限为0777。 - I am the Most Stupid Person
21个回答

4

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

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

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

另外还有一个 WordPress 函数叫做wp_upload_dir()。它返回上传目录路径,并在不存在时创建文件夹。

$upload_path = wp_upload_dir();

以下代码是关于PHP的一般性问题的。
if (!is_dir('path/to/directory')) mkdir('path/to/directory', 0777, true);

函数参考:PHP is_dir()


1
对于WordPress使用,更安全的方法是使用wp_get_upload_dir()函数。 - Ivijan Stefan Stipić
@IvijanStefanStipić,您能解释一下为什么您认为我的代码不安全吗?我故意没有使用wp_get_upload_dir()函数。这样用户可以创建任何文件夹,而不仅仅是上传文件夹。 - Usman Ahmed
1
该函数返回上传文件夹的基本目录和基本URL。如果有人使用安全插件或CDN并想要更改它,将会依赖于该函数。我已经开发了大约8年的WP插件,相信我,在生产中你需要提前考虑。你只需要添加自定义文件夹并在不存在时创建即可。 - Ivijan Stefan Stipić
为什么在WordPress中与原生PHP不同?这是绝对必要的吗?更安全吗?(不是反问句。) - Peter Mortensen

3

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

考虑问题的环境:

  • WordPress。
  • Webhosting服务器。
  • 假设使用运行PHP的Linux系统,而不是Windows操作系统。

引用自:mkdir

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

手册中指出,唯一必需的参数是$pathname

因此,我们可以简单编写如下代码:

<?php
    error_reporting(0); 

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

解释:

我们不需要传递任何参数或检查文件夹是否存在,也不需要传递模式参数,除非需要考虑以下原因:

  • 该命令将创建具有0755权限(共享托管文件夹的默认权限)或0777,命令的默认权限。
  • mode在运行PHP的Windows托管环境中被忽略。
  • 已经为mkdir命令内置了一个检查器,用于检查文件夹是否存在; 因此,我们只需要检查返回值True|False; 它不是错误,只是警告,并且警告在托管服务器上默认禁用。
  • 在警告禁用的情况下,这比较快。

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

它在PHP 7、生产服务器和Linux上进行了测试。


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

3
你也可以尝试以下方法:
$dirpath = "path/to/dir";
$mode = "0764";
is_dir($dirpath) || mkdir($dirpath, $mode, true);

3
如果你想避免file_existsis_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);
}

3

给你。

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

PHPStorm(带有PHP检查)正好给出了这个建议;-)顺便说一句,您可以将外部if合并到内部:if(!is_dir(...)&&!mkdir(...)&&!is_dir(...))... - aProgger
@aProgger 如果将它们分开会更好看。很多程序员不会合并if语句。 - c0d3x1337
这只是个口味问题。我会将它们合并甚至去掉大括号,使其成为一行代码。但我很好奇。你会仅分离第一个!is_dir还是最后一个也要分离? - aProgger
哇,所有答案中,这是唯一一个具有有意义的错误处理和强大的解决方案。恭喜你,你赢得了我的互联网积分。 - sba

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

4
通过错误抑制,就不需要检查目录是否存在。 - neoascetic
5
处理错误比压制错误更好。如果处理失败,你将无法从中得知原因,必须进行进一步研究。 - Tim Ogilvy
在高并发/多线程环境中,建议抑制错误。可能会出现竞态条件,在这种情况下,两个或更多线程将评估is_dir()为false,并尝试创建目录。第一个线程将能够轻松创建它,但其他线程将无法这样做,因为该目录已经存在。为了避免错过实际失败的目录创建,您应该在调用@mkdir()后再次检查目录的存在性。 - tobain

0
我们可以使用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)
  
?>

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。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接