Creare una cartella se non esiste già

Mi sono imbattuto in alcuni casi di installazioni di WordPress con Bluehost dove ho incontrato errori con il mio tema WordPress perché la cartella uploads wp-content/uploads non era presente.

A quanto pare il Bluehost cPanel WP installer non crea questa cartella, anche se HostGator lo fa.

Quindi ho bisogno di aggiungere del codice al mio tema che controlli la cartella e la crei altrimenti.

Soluzione

Prova questo:

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

Si noti che 0777 è già il modo predefinito per le directory e può ancora essere modificato dalla umask corrente.

Commentari (10)

Qualcosa di un po' più universale visto che questo viene fuori su Google. Mentre i dettagli sono più specifici, il titolo di questa domanda è più universale.

/** 
 * 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;
}

Questo prenderà un percorso, possibilmente con una lunga catena di directory non create, e continuerà a salire di una directory finché non arriva a una directory esistente. Poi tenterà di creare la prossima directory in quella directory, e continuerà finché non avrà creato tutte le directory. Restituisce true se ha successo.

Potrebbe essere migliorato fornendo un livello di arresto in modo che fallisca solo se va oltre la cartella utente o qualcosa del genere e includendo i permessi.

Commentari (3)

Che ne dite di una funzione di aiuto come questa?

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

Restituirà true se la directory è stata creata con successo o esiste già, e false se la directory non può essere creata.

Un'alternativa migliore è questa (non dovrebbe dare alcun avvertimento):

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