Maak een map aan als die nog niet bestaat

Ik'ben een paar gevallen tegengekomen met WordPress installaties bij Bluehost waar ik'fouten heb ondervonden met mijn WordPress thema omdat de uploads map wp-content/uploads niet aanwezig was.

Blijkbaar maakt de Bluehost cPanel WP installer deze map niet aan, HostGator doet dat wel.

Ik moet dus code toevoegen aan mijn thema die controleert of de map aanwezig is en deze anders aanmaakt.

Oplossing

Probeer dit eens:

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

Merk op dat 0777 al de standaard modus is voor directories en nog steeds kan worden gewijzigd door de huidige umask.

Commentaren (10)

Iets meer universeel, aangezien dit op google naar boven komt. Hoewel de details specifieker zijn, is de titel van deze vraag universeler.

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

Dit zal een pad nemen, mogelijk met een lange keten van niet aangemaakte directories, en één directory omhoog blijven gaan totdat het bij een bestaande directory komt. Dan zal het proberen om de volgende map in die map aan te maken, en zo verder tot het alle mappen heeft aangemaakt. Het geeft true terug indien succesvol.

Zou verbeterd kunnen worden door een stopniveau te voorzien zodat het enkel faalt als het voorbij de gebruikersmap gaat of zoiets en door permissies in te sluiten.

Commentaren (3)

Wat dacht je van een helperfunctie als deze:

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

Het zal true teruggeven als de directory succesvol is aangemaakt of al bestaat, en false als de directory'niet kon worden aangemaakt.

Een beter alternatief is dit (zou geen waarschuwingen moeten geven):

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