Erstellen Sie einen Ordner, wenn er noch nicht existiert.

I've in ein paar Fällen mit WordPress Installationen mit Bluehost, wo I've aufgetretenen Fehler mit meinem WordPress Thema, weil die Uploads Ordner wp-content/uploads war nicht vorhanden.

Anscheinend erstellt das cPanel WP-Installationsprogramm von Bluehost diesen Ordner nicht, während HostGator dies tut.

Ich muss also Code in mein Theme einfügen, der den Ordner sucht und ihn andernfalls erstellt.

Lösung

Versuchen Sie dies:

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

Beachten Sie, dass 0777 bereits der Standardmodus für Verzeichnisse ist und durch die aktuelle umask noch verändert werden kann.

Kommentare (10)

Etwas, das etwas universeller ist, da dies bei Google auftaucht. Während die Details eher spezifisch sind, ist der Titel dieser Frage eher universell.

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

Dies nimmt einen Pfad, möglicherweise mit einer langen Kette von nicht erstellten Verzeichnissen, und geht ein Verzeichnis nach oben, bis es zu einem bestehenden Verzeichnis kommt. Dann versucht es, das nächste Verzeichnis in diesem Verzeichnis zu erstellen und fährt fort, bis es alle Verzeichnisse erstellt hat. Bei Erfolg gibt er true zurück.

Könnte verbessert werden, indem man eine Stoppstufe bereitstellt, so dass es einfach fehlschlägt, wenn es über den Benutzerordner hinausgeht, und indem man die Berechtigungen einbezieht.

Kommentare (3)

Wie wäre es mit einer Hilfsfunktion wie dieser:

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

Sie wird true zurückgeben, wenn das Verzeichnis erfolgreich erstellt wurde oder bereits existiert, und false, wenn das Verzeichnis nicht erstellt werden konnte.

Eine bessere Alternative ist diese (sollte keine Warnungen ausgeben):

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