如果目录存在,我该如何检查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();