769 Stimmen

Erstellen Sie einen Ordner, wenn er noch nicht existiert

Ich habe ein paar Fälle mit WordPress-Installationen erlebt, bei denen Bluehost wo ich mit meinem WordPress-Theme auf Fehler gestoßen bin, weil der Uploads-Ordner wp-content/uploads war nicht anwesend.

Offenbar ist der Bluehost cPanel Der WordPress-Installer erstellt diesen Ordner jedoch nicht HostGator tut.

Ich muss also Code zu meinem Thema hinzufügen, der den Ordner sucht und ihn andernfalls erstellt.

17 Stimmen

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

1519voto

Gumbo Punkte 617646

Versuchen Sie dies, indem Sie mkdir :

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

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

16 Stimmen

Sie haben das Flag "rekursiv" übersehen - siehe die Antwort von Satish.

141 Stimmen

Is_dir() ist etwas schneller, als file_exists()

55 Stimmen

@YuryPliashkou Ja, vielleicht, aber es funktioniert nicht, wenn es bereits eine Datei mit diesem Namen.

185voto

Satish Gadhave Punkte 2640

Hier ist das fehlende Stück. Sie müssen das Flag 'rekursiv' als drittes Argument (boolean true) in mkdir so anrufen:

mkdir('path/to/directory', 0755, true);

13 Stimmen

Das Flag "rekursiv" ist das 3. boolesche Argument true

76voto

AndiDog Punkte 65445

Verwenden Sie eine Hilfsfunktion wie diese:

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

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

A besser Die Alternative ist diese (sollte keine Warnungen auslösen):

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

7 Stimmen

Wenn Sie die @ und ersetzen Sie sie durch eine richtige is_dir check, mein upvote ist deins :) Bonuspunkte für die Überprüfung, ob das übergeordnete Verzeichnis is_writable() für eine wasserdichte Hilfsfunktion.

0 Stimmen

Die Verwendung von @ zur Unterdrückung der Fehler ist ein Leistungsverlust. Besser ist es, wie bei Gumbo zu prüfen, ob es nicht schon existiert.

1 Stimmen

Unabhängig von der Fehlerunterdrückung neige ich bei dem ersten Beispiel zu -1. Das zweite ist so viel besser, dass das erste sinnlos ist.

75voto

phazei Punkte 5185

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

/**
 * 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.

Es könnte verbessert werden, indem man eine Stopp-Stufe einführt, so dass es einfach fehlschlägt, wenn es über den Benutzerordner hinausgeht, und indem man Berechtigungen einbezieht.

1 Stimmen

@phazei Ich erhalte einen Aufruf einer undefinierten Funktion wegen der Zeile $return = createPath($prev_path);

0 Stimmen

Danke @phazei :)

38voto

Elyor Punkte 4992

Ein schnellerer Weg, um einen Ordner zu erstellen:

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

0 Stimmen

Dies würde zu einem Fehler führen, wenn es eine Datei mit dem Namen "directory" in diesem Pfad gibt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X