Opprett en mappe hvis den ikke allerede finnes.

Jeg har støtt på noen få tilfeller med WordPress-installasjoner med Bluehost der jeg har støtt på feil med WordPress-temaet mitt fordi opplastingsmappen wp-content/uploads ikke var til stede.

Tilsynelatende oppretter ikke Bluehost cPanel WP-installasjonsprogrammet denne mappen, selv om HostGator gjør det.

Så jeg må legge til kode i temaet mitt som ser etter mappen og oppretter den ellers.

Løsning

Prøv dette:

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

Merk at 0777 allerede er standardmodus for kataloger og fortsatt kan endres av gjeldende umask.

Kommentarer (10)

Noe litt mer universelt siden dette kommer opp på google. Mens detaljene er mer spesifikke, er tittelen på dette spørsmålet mer universelt.

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

Dette vil ta en sti, muligens med en lang kjede av uopprettede kataloger, og fortsette å gå opp en katalog til den kommer til en eksisterende katalog. Deretter vil den forsøke å opprette den neste katalogen i den katalogen, og fortsette til den har opprettet alle katalogene. Den returnerer true hvis den lykkes.

Kan forbedres ved å gi et stoppnivå slik at det bare mislykkes hvis det går utover brukermappen eller noe, og ved å inkludere tillatelser.

Kommentarer (3)

Hva med en hjelpefunksjon som dette:

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

Den vil returnere true hvis katalogen ble opprettet eller allerede eksisterer, og false hvis katalogen ikke kunne opprettes.

Et bedre alternativ er dette (bør ikke gi noen advarsler):

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