Ustvarite mapo, če še ne obstaja

I've naleteli na nekaj primerov z WordPress namesti z Bluehost, kjer I've naleteli na napake z mojo temo WordPress, ker mape za nalaganje wp-content/uploads ni bilo prisotno.

Očitno Bluehostov namestitveni program WP v cPanelu ne ustvari te mape, čeprav jo HostGator ustvari.

Zato moram v svojo temo dodati kodo, ki preveri, ali je mapa vzpostavljena, in jo v nasprotnem primeru ustvari.

Rešitev

Poskusite to:

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

Upoštevajte, da je 0777 že privzeti način za imenike in ga lahko še vedno spremenite s trenutno umasko.

Komentarji (10)

Nekaj bolj univerzalnega, saj se to pojavlja na Googlu. Medtem ko so podrobnosti bolj specifične, je naslov tega vprašanja bolj univerzalen.

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

To bo vzelo pot, po možnosti z dolgo verigo nerazvitih imenikov, in se povzpelo za en imenik, dokler ne bo prišlo do obstoječega imenika. Nato bo poskušal ustvariti naslednji imenik v tem imeniku in nadaljeval, dokler ne bo ustvaril vseh imenikov. Če je uspešno, vrne true.

Izboljšali bi ga lahko z določitvijo stopnje zaustavitve, tako da bi bil neuspešen, če bi presegel uporabniško mapo ali kaj podobnega, in z vključitvijo dovoljenj.

Komentarji (3)

Kaj pa pomožna funkcija, kot je ta:

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

Vrnila bo true, če je bil imenik uspešno ustvarjen ali že obstaja, in false, če imenika ni bilo mogoče ustvariti.

Boljša** alternativa je ta (ne bi smela dajati nobenih opozoril):

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