如果目录存在,我该如何检查PHP?
我想创build一个目录,如果它不存在。 只是使用is_dir
函数可以达到这个目的吗? 例如:
if (!is_dir($dir)) { mkdir($dir); }
或者我也应该使用file_exists
? 例如:
if (!file_exists($dir) && !is_dir($dir)) { mkdir($dir); }
两者都将在Unix系统上返回true – 在Unix中,一切都是一个文件,包括目录。 但为了testing这个名字是否被采用,你应该检查两个。 可能会有一个名为“foo”的常规文件,这会阻止您创build目录名称“foo”。
$dirname = $_POST["search"]; $filename = "/folder/" . $dirname . "/"; if (!file_exists($filename)) { mkdir("folder/" . $dirname, 0777); echo "The directory $dirname was successfully created."; exit; } else { echo "The directory $dirname exists."; }
我认为realpath()可能是validationpath是否存在的最好方法http://www.php.net/realpath
这是一个示例函数:
<?php /** * Checks if a folder exist and return canonicalized absolute pathname (long version) * @param string $folder the path being checked. * @return mixed returns the canonicalized absolute pathname on success otherwise FALSE is returned */ function folder_exist($folder) { // Get canonicalized absolute pathname $path = realpath($folder); // If it exist, check if it's a directory if($path !== false AND is_dir($path)) { // Return canonicalized absolute pathname return $path; } // Path/folder does not exist return false; }
相同function的短版本
<?php /** * Checks if a folder exist and return canonicalized absolute pathname (sort version) * @param string $folder the path being checked. * @return mixed returns the canonicalized absolute pathname on success otherwise FALSE is returned */ function folder_exist($folder) { // Get canonicalized absolute pathname $path = realpath($folder); // If it exist, check if it's a directory return ($path !== false AND is_dir($path)) ? $path : false; }
输出示例
<?php /** CASE 1 **/ $input = '/some/path/which/does/not/exist'; var_dump($input); // string(31) "/some/path/which/does/not/exist" $output = folder_exist($input); var_dump($output); // bool(false) /** CASE 2 **/ $input = '/home'; var_dump($input); $output = folder_exist($input); // string(5) "/home" var_dump($output); // string(5) "/home" /** CASE 3 **/ $input = '/home/..'; var_dump($input); // string(8) "/home/.." $output = folder_exist($input); var_dump($output); // string(1) "/"
用法
<?php $folder = '/foo/bar'; if(FALSE !== ($path = folder_exist($folder))) { die('Folder ' . $path . ' already exist'); } mkdir($folder); // Continue do stuff
问题二的第二个变种是不正确的,因为如果你已经有了同名的文件,但它不是一个目录, !file_exists($dir)
将返回false
,不会创build文件夹,所以错误"failed to open stream: No such file or directory"
将会发生。 在Windows中,“文件”和“文件夹”types是有区别的,所以需要同时使用file_exists()
和is_dir()
,例如:
if (file_exists('file')) { if (!is_dir('file')) { //if file is already present, but it's not a dir //do something with file - delete, rename, etc. unlink('file'); //for example mkdir('file', NEEDED_ACCESS_LEVEL); } } else { //no file exists with this name mkdir('file', NEEDED_ACCESS_LEVEL); }
$year = date("Y"); $month = date("m"); $filename = "../".$year; $filename2 = "../".$year."/".$month; if(file_exists($filename)){ if(file_exists($filename2)==false){ mkdir($filename2,0777); } }else{ mkdir($filename,0777); }
$save_folder = "some/path/" . date('dmy'); if (!file_exists($save_folder)) { mkdir($save_folder, 0777); }
那么,而不是检查两者,你可以做if(stream_resolve_include_path($folder)!==false)
。 速度较慢,但一枪杀死两只鸟。
另一种select是简单地忽略E_WARNING
, 而不是使用@mkdir(...);
(因为这会简单地放弃所有可能的警告,而不仅仅是目录已经存在的警告),而是通过在执行之前注册特定的error handling程序:
namespace com\stackoverflow; set_error_handler(function($errno, $errm) { if (strpos($errm,"exists") === false) throw new \Exception($errm); //or better: create your own FolderCreationException class }); mkdir($folder); /* possibly more mkdir instructions, which is when this becomes useful */ restore_error_handler();