如何检查目录是否存在? “is_dir”,“file_exists”或两者兼而有之?

时间:2011-03-24 21:38:13

标签: php

如果目录不存在,我想创建一个目录。

是否已将is_dir用于此目的?

if ( !is_dir( $dir ) ) {
    mkdir( $dir );       
}

或者我应该将is_dirfile_exists合并?

if ( !file_exists( $dir ) && !is_dir( $dir ) ) {
    mkdir( $dir );       
} 

12 个答案:

答案 0 :(得分:190)

两者都会在Unix系统上返回true - 在Unix中,一切都是文件,包括目录。但要测试是否采用该名称,您应该检查两者。可能有一个名为'foo'的常规文件,这会阻止您创建目录名'foo'。

答案 1 :(得分:123)

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

答案 2 :(得分:16)

我认为realpath()可能是验证路径是否存在的最佳方法 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;
}

同一功能的短版本

<?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

答案 3 :(得分:7)

问题帖子中的第二个变体不正常,因为,如果您已经拥有相同名称的文件,但它不是目录,!file_exists($dir)将返回false,则不会创建文件夹,所以会发生错误"failed to open stream: No such file or directory"。在Windows中,“文件”和“文件夹”类型之间存在差异,因此需要同时使用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);
}

答案 4 :(得分:3)

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

答案 5 :(得分:2)

$save_folder = "some/path/" . date('dmy');

if (!file_exists($save_folder)) {
   mkdir($save_folder, 0777);
}

答案 6 :(得分:2)

在0777之后添加

<?php
    $dirname = "small";
    $filename = "upload/".$dirname."/";

    if (!is_dir($filename )) {
        mkdir("upload/" . $dirname, 0777, true);
        echo "The directory $dirname was successfully created.";
        exit;
    } else {
        echo "The directory $dirname exists.";
    }
     ?>

答案 7 :(得分:1)

好而不是同时检查两者,你可以做if(stream_resolve_include_path($folder)!==false)。它是slower,但一次杀死了两只鸟。

另一种选择是使用E_WARNING忽略@mkdir(...);而不是(因为这只会放弃所有可能的警告,而不仅仅是已存在的目录),但是在执行之前注册一个特定的错误处理程序:

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

答案 8 :(得分:0)

我也有同样的疑问,但请参阅PHP文档:

https://www.php.net/manual/en/function.file-exists.php

https://www.php.net/manual/en/function.is-dir.php

您将看到is-dir具有这两个属性。

  

返回值is_dir   如果文件名存在并且是目录,则返回TRUE,否则返回FALSE。

答案 9 :(得分:0)

这是一个古老但仍是话题性的问题。只需使用is_dir()file_exists()函数测试被测目录中...文件是否存在。每个目录必须包含以下文件:

is_dir("path_to_directory/.");    

答案 10 :(得分:0)

这就是我的方式

if(is_dir("./folder/test"))
{
  echo "Exist";
}else{
  echo "Not exist";
}

答案 11 :(得分:0)

一种检查路径是否为目录的方法可以如下:

function isDirectory($path) {
    $all = @scandir($path);
    return $all !== false;
}

注意:对于不存在的路径,它也将返回false,但是对于UNIX / Windows来说,它是完美的