web-dev-qa-db-fra.com

Créer un dossier s'il n'existe pas déjà

J'ai rencontré quelques cas d'installations WordPress avec Bluehost où j'ai rencontré des erreurs avec mon thème WordPress car le dossier de téléchargement wp-content/uploads n'était pas présent.

Apparemment, le programme d’installation Bluehost cPanel WP ne crée pas ce dossier, contrairement à HostGator.

J'ai donc besoin d'ajouter du code à mon thème pour vérifier le dossier et le créer autrement.

544
Scott B

Essaye ça:

if (!file_exists('path/to/directory')) {
    mkdir('path/to/directory', 0777, true);
}

Notez que 0777 est déjà le mode par défaut pour les répertoires et peut toujours être modifié par le umask actuel.

1074
Gumbo

Voici la pièce manquante. Vous devez passer le drapeau 'récursif' en tant que troisième argument (boolean true) dans l'appel mkdir comme ceci:

mkdir('path/to/directory', 0755, true);
118
Satish Gadhave

Quelque chose d'un peu plus universel depuis que cela arrive sur google. Bien que les détails soient plus précis, le titre de cette question est plus universel.

/** 
 * recursively create a long directory path
 */
function createPath($path) {
    if (is_dir($path)) return true;
    $prev_path = substr($path, 0, strrpos($path, '/', -2) + 1 );
    $return = createPath($prev_path);
    return ($return && is_writable($prev_path)) ? mkdir($path) : false;
}

Cela prendra un chemin, éventuellement avec une longue chaîne de répertoires incréés, et continuera à monter d’un répertoire jusqu’à ce qu’il atteigne un répertoire existant. Ensuite, il essaiera de créer le répertoire suivant dans ce répertoire et continuera jusqu'à ce qu'il soit créé tous les répertoires. Il retourne vrai en cas de succès.

Pourrait être amélioré en fournissant un niveau d'arrêt afin qu'il échoue si le contenu dépasse le dossier de l'utilisateur ou quelque chose de ce type, et en incluant des autorisations.

61
phazei

Qu'en est-il une fonction d'assistance comme ceci:

function makeDir($path)
{
     $ret = mkdir($path); // use @mkdir if you want to suppress warnings/errors
     return $ret === true || is_dir($path);
}

Il renverra true si le répertoire a été créé avec succès ou existe déjà, et false si le répertoire n'a pas pu être créé.

Une meilleure alternative est la suivante (ne devrait donner aucun avertissement):

function makeDir($path)
{
     return is_dir($path) || mkdir($path);
}
51
AndiDog

Moyen plus rapide de créer un dossier:

if (!is_dir('path/to/directory')) {
    mkdir('path/to/directory', 0777, true);
}
22
Elyor

Créer récursivement le chemin du répertoire:

function makedirs($dirpath, $mode=0777) {
    return is_dir($dirpath) || mkdir($dirpath, $mode, true);
}

Inspiré par os.makedirs()

21
user

Dans WordPress, vous trouverez également la fonction très pratique wp_mkdir_p qui créera récursivement une structure de répertoires. 

Source pour référence: -

function wp_mkdir_p( $target ) {
    $wrapper = null;

    // strip the protocol
    if( wp_is_stream( $target ) ) {
        list( $wrapper, $target ) = explode( '://', $target, 2 );
    }

    // from php.net/mkdir user contributed notes
    $target = str_replace( '//', '/', $target );

    // put the wrapper back on the target
    if( $wrapper !== null ) {
        $target = $wrapper . '://' . $target;
    }

    // safe mode fails with a trailing slash under certain PHP versions.
    $target = rtrim($target, '/'); // Use rtrim() instead of untrailingslashit to avoid formatting.php dependency.
    if ( empty($target) )
        $target = '/';

    if ( file_exists( $target ) )
        return @is_dir( $target );

    // We need to find the permissions of the parent folder that exists and inherit that.
    $target_parent = dirname( $target );
    while ( '.' != $target_parent && ! is_dir( $target_parent ) ) {
        $target_parent = dirname( $target_parent );
    }

    // Get the permission bits.
    if ( $stat = @stat( $target_parent ) ) {
        $dir_perms = $stat['mode'] & 0007777;
    } else {
        $dir_perms = 0777;
    }

    if ( @mkdir( $target, $dir_perms, true ) ) {

        // If a umask is set that modifies $dir_perms, we'll have to re-set the $dir_perms correctly with chmod()
        if ( $dir_perms != ( $dir_perms & ~umask() ) ) {
            $folder_parts = explode( '/', substr( $target, strlen( $target_parent ) + 1 ) );
            for ( $i = 1; $i <= count( $folder_parts ); $i++ ) {
                @chmod( $target_parent . '/' . implode( '/', array_slice( $folder_parts, 0, $i ) ), $dir_perms );
            }
        }

        return true;
    }

    return false;
}
7
Trevor Mills

J'ai besoin de la même chose pour un site de connexion. Je devais créer un répertoire avec deux variables . Le répertoire $ est le dossier principal dans lequel je voulais créer un autre sous-dossier avec le numéro de licence de l'utilisateur.

include_once("../include/session.php");
$lnum = $session->lnum; //Users license number from sessions
$directory = uploaded_labels; // Name of directory that folder is being created in

if (!file_exists($directory."/".$lnum)) {
mkdir($directory."/".$lnum, 0777, true);
}
3
Progrower

Il s'agit de la solution la plus récente sans suppression des erreurs:

if (!is_dir('path/to/directory')) {
    mkdir('path/to/directory');
}
2
Andreas
$upload = wp_upload_dir();
$upload_dir = $upload['basedir'];
$upload_dir = $upload_dir . '/newfolder';
if (! is_dir($upload_dir)) {
   mkdir( $upload_dir, 0700 );
}
0
Nikunj Kathrotiya

Pour créer un dossier s'il n'existe pas déjà

Considérant l'environnement de la question.

  • WordPress.
  • Serveur d'hébergement Web.
  • En supposant que Linux ne fonctionne pas sous Windows avec PHP.

Et en citant: http://php.net/manual/en/function.mkdir.php

bool mkdir (string $ cheminNom [ int $ mode = 0777 [ bool $ récursif = FALSE [ ressource $ contexte]]])

Manuel dit que le seul paramètre requis est le $pathname!

alors, nous pouvons simplement coder:

<?php
error_reporting(0); 
if(!mkdir('wp-content/uploads')){
   // todo
}
?>

Explication:

Nous n'avons pas besoin de transmettre de paramètre ni de vérifier si le dossier existe ou même de passer le paramètre de mode sauf si nécessaire; Pour les raisons suivantes:

  • La commande créera le dossier avec l'autorisation 0755 (autorisation par défaut du dossier d'hébergement partagé) ou 0777 par défaut.
  • mode est ignoré sur Hébergement Windows sous PHP.
  • Déjà, la commande mkdir a été intégrée au vérificateur si le dossier existe; nous devons donc vérifier le retour uniquement Vrai | Faux; et ce n'est pas une erreur, c'est seulement un avertissement et Avertissement est désactivé par défaut dans les serveurs d'hébergement.
  • Selon la vitesse, ceci est plus rapide si l'avertissement est désactivé.

Ceci est juste une autre façon d’envisager la question et de ne pas prétendre à une solution meilleure ou optimale.

Testé sur PHP7, serveur de production, Linux

0
WPDev

Si vous voulez éviter le problème file_exists VS is_dir, je vous suggère de regarder ici

J'ai essayé cela et il ne crée le répertoire que si le répertoire n'existe pas . Peu importe, il existe un fichier portant ce nom.

/* Creates the directory if it does not exist */
$path_to_directory = 'path/to/directory';
if (!file_exists($path_to_directory) && !is_dir($path_to_directory)) {
    mkdir($path_to_directory, 0777, true);
}
0
joaorodr84

Nous devrions toujours modulariser notre code et j'ai écrit les mêmes vérifications ci-dessous ....__ Nous vérifions d'abord le répertoire, si le répertoire est absent, nous le créons.

$boolDirPresents = $this->CheckDir($DirectoryName);

if (!$boolDirPresents) {
        $boolCreateDirectory = $this->CreateDirectory($DirectoryName);
        if ($boolCreateDirectory) {
        echo "Created successfully";
      }
  }

function CheckDir($DirName) {
    if (file_exists($DirName)) {
        echo "Dir Exists<br>";
        return true;
    } else {
        echo "Dir Not Absent<br>";
        return false;
    }
}

function CreateDirectory($DirName) {
    if (mkdir($DirName, 0777)) {
        return true;
    } else {
        return false;
    }
}
0
Aditya Malviya

Vous pouvez aussi essayer:

$dirpath = "path/to/dir";
$mode = "0777";
is_dir($dirpath) || mkdir($dirpath, $mode, true);
0
simhumileco
if (!is_dir('path_directory')) {
    @mkdir('path_directory');
}
0
Mayur Kukadiya

Vous devez d’abord vérifier si le répertoire existe file_exists('path_to_directory')

Puis utilisez mkdir(path_to_directory) pour créer un répertoire

mkdir (string $ chemin chemin [ int $ mode = 0777 [ bool $ recursive = FAUX [ resource $ contexte]]]): bool

En savoir plus sur mkdir () here

Code complet ici:

$structure = './depth1/depth2/depth3/';
if (!file_exists($structure)) {
    mkdir($structure);
}
0
Nasir Khan