366 votes

Comment vérifier si un répertoire existe ? "is_dir", "file_exists" ou les deux ?

Je veux créer un répertoire s'il n'existe pas déjà.

Utilise-t-il le is_dir suffisant pour cet objectif ?

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

Ou devrais-je combiner is_dir con file_exists ?

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

3 votes

L'opérateur booléen OR devrait être AND, et en PHP, il s'écrit &&.

16 votes

@IvoRenkema PHP prend également en charge or / and en plus de || / && .

2 votes

Opérateur && est inutile ici, car, si le fichier n'existe pas ( !file_exists($dir) == true ), il est certain qu'il ne s'agit pas d'un répertoire. Et si le fichier existe, !is_dir($dir) ne sera pas vérifié, car !file_exists($dir) retournera false y && L'opérateur est court-circuit .

245voto

Marc B Points 195501

Les deux renverraient vrai sur les systèmes Unix - dans Unix tout est un fichier, y compris les répertoires. Mais pour tester si ce nom est pris, vous devez vérifier les deux. Il pourrait y avoir un fichier ordinaire nommé 'foo', ce qui vous empêcherait de créer un répertoire nommé 'foo'.

39 votes

N'oubliez pas de vérifier si is_writable aussi

10 votes

@Drewdin vous devriez vérifier le parent pour is_writable n'est-ce pas ?

142voto

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

47 votes

C'est exactement ce que dit l'écho

13 votes

Si l'on considère qu'il prend l'entrée du post et l'utilise telle quelle, et qu'il fait le 0777 dir, il n'est pas si sûr du tout ;P

2 votes

Plus sérieusement, $dirname pourrait être nettoyé et la permission pourrait être fixée à 0755. Ajoutez à cela quelques directives .htaccess. Vous trouverez d'autres recommandations sur le site de l'OWASP : owasp.org

20voto

user1036690 Points 29

Je pense que realpath() est la meilleure façon de valider l'existence d'un chemin. http://www.php.net/realpath

Voici un exemple de fonction :

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

Version courte de la même fonction

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

Exemples de sorties

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

Utilisation

<?php

$folder = '/foo/bar';

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

mkdir($folder);
// Continue do stuff

2 votes

Pour ceux qui rencontrent ce problème, je crois que realpath met en cache les dossiers lorsqu'il s'exécute, donc s'il est exécuté une fois, puis le dossier est supprimé après cela, il peut ne pas retourner faux s'il est exécuté à nouveau.

2 votes

Mais file_exists aussi

7voto

Boolean_Type Points 808

La deuxième variante dans le post de la question n'est pas correcte, parce que, si vous avez déjà un fichier avec le même nom, mais ce n'est pas un répertoire, !file_exists($dir) retournera false le dossier ne sera pas créé, d'où l'erreur "failed to open stream: No such file or directory" se produira. Sous Windows, il y a une différence entre les types de fichiers et de dossiers. file_exists() y is_dir() en même temps, par exemple. :

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

4voto

J'avais le même doute, mais voir le docu PHP :

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

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

Vous verrez que is_dir() possède les deux propriétés.

Valeurs de retour is_dir Retourne TRUE si le nom de fichier existe et est un répertoire, FALSE sinon.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X