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


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

Apparemment, le programme d'installation de WP Bluehost cPanel ne crée pas ce dossier, même si HostGator le fait.

J'ai donc besoin d'ajouter du code à mon thème qui vérifie le dossier et le crée autrement.


503
2018-02-20 19:26


origine


Réponses:


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 encore être modifié par l'umask actuel.


970
2018-02-20 19:28



Voici la pièce manquante. Vous devez passer le drapeau 'recursive' comme troisième argument (boolean true) dans l'appel de mkdir comme ceci:

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

105
2018-02-25 19:52



Quelque chose d'un peu plus universel puisque cela arrive sur google. Alors que les détails sont plus spécifiques, 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 non créés, et continuera à monter 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 que tous les répertoires soient créés. Il retourne vrai si réussi.

Pourrait être amélioré en fournissant un niveau d'arrêt de sorte qu'il échoue juste s'il dépasse le dossier de l'utilisateur ou quelque chose et en incluant des autorisations.


58
2018-06-01 17:44



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 reviendra 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 meilleur alternative est ceci (ne devrait pas donner des avertissements):

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

48
2018-02-20 19:33



Créer de manière récursive le chemin du répertoire:

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

Inspiré par Python os.makedirs()


21
2017-07-05 23:09



Méthode plus rapide pour créer un dossier:

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

19
2017-09-14 06:35



Dans WordPress, il y a aussi la fonction très pratique wp_mkdir_p qui créera récursivement une structure de répertoire.

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
2018-04-12 00:14