406 Stimmen

Wie kann ich prüfen, ob ein Verzeichnis existiert? "is_dir", "file_exists" oder beides?

Ich möchte ein Verzeichnis erstellen, wenn es noch nicht existiert.

Ist die Verwendung des is_dir Funktion genug für diesen Zweck?

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

Oder soll ich kombinieren is_dir con file_exists ?

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

267voto

Marc B Punkte 347897

Beide würden auf Unix-Systemen true zurückgeben - unter Unix ist alles eine Datei, auch Verzeichnisse. Aber um zu testen, ob der Name schon vergeben ist, sollten Sie beide prüfen. Es könnte eine reguläre Datei mit dem Namen "foo" existieren, was Sie daran hindern würde, ein Verzeichnis mit dem Namen "foo" zu erstellen.

160voto

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

26voto

inckie Punkte 152

Ich denke, realpath() ist der beste Weg, um zu überprüfen, ob ein Pfad existiert http://www.php.net/realpath

Hier ist eine Beispielfunktion:

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

Kurzversion der gleichen Funktion

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

Beispiele für die Ausgabe

<?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) "/"

Verwendung

<?php

$folder = '/foo/bar';

if(FALSE !== ($path = folder_exist($folder)))
{
    die('Folder ' . $path . ' already exist');
}

mkdir($folder);
// Continue do stuff

7voto

Boolean_Type Punkte 1063

Zweite Variante in Frage Beitrag ist nicht in Ordnung, weil, wenn Sie bereits eine Datei mit dem gleichen Namen, aber es ist nicht ein Verzeichnis, !file_exists($dir) wird zurückgegeben false wird der Ordner nicht erstellt, so dass der Fehler "failed to open stream: No such file or directory" erfolgt. In Windows gibt es einen Unterschied zwischen den Typen "Datei" und "Ordner", daher müssen Sie file_exists() y is_dir() zur gleichen Zeit, zum Beispiel:

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

5voto

Ich hatte die gleichen Zweifel, aber siehe die PHP-Doku:

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

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

Sie werden sehen, dass is_dir() hat beide Eigenschaften.

Rückgabewerte is_dir Gibt TRUE zurück, wenn der Dateiname existiert und ein Verzeichnis ist, ansonsten FALSE.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X