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); }

25voto

user Punkte 19524

Rekursiv den Verzeichnispfad erstellen:

function makedirs($dirpath, $mode=0777) {
    return is_dir($dirpath) || mkdir($dirpath, $mode, true);
}

Inspiriert von Pythons os.makedirs()

0 Stimmen

Auf welche Weise ist sie rekursiv? Nicht in den Funktionsaufrufen (sie ruft sich nicht selbst auf)? Was ist das Funktionsprinzip? Warum funktioniert es? Macht mkdir das rekursiv? Kannst du deine Antwort ein bisschen ausführlicher gestalten? (Aber なくしては "Bearbeiten:", "Aktualisieren:" oder ähnlich - die Antwort sollte so aussehen, als wäre sie heute geschrieben worden).

0 Stimmen

Es gibt eine Erklärung in Antwort von Satish Gadhave .

22voto

WP Punk Punkte 1185

Am besten verwenden Sie die wp_mkdir_p Funktion. Diese Funktion wird rekursiv erstellen Sie einen Ordner mit dem richtige Berechtigungen .

Außerdem können Sie Ordner überspringen Bedingung existiert weil die Funktion zurückkehrt:

  • true wenn das Verzeichnis erstellt wurde oder vorher existierte
  • false wenn Sie das Verzeichnis nicht erstellen können.

Ejemplo:

$path = 'path/to/directory';
if ( wp_mkdir_p( $path ) ) {
    // Directory exists or was created.
}

Mehr: https://developer.wordpress.org/reference/functions/wp_mkdir_p/

4 Stimmen

Es ist erwähnenswert, dass wp_mkdir_p() gibt auch true zurück, wenn das Verzeichnis bereits existiert, Sie brauchen also keine zusätzlichen file_exists() Kontrollen. Außerdem wird sie ihr Bestes tun, um die richtigen Verzeichnisberechtigungen zu setzen. Ich würde immer mit dieser Funktion arbeiten, anstatt das Rad neu zu erfinden.

2 Stimmen

Es ist auch erwähnenswert, dass es sich um eine WordPress-spezifische Funktion handelt, nicht um eine allgemeine PHP-Funktion. Das heißt, es spricht nichts dagegen, die Funktion einfach von der WordPress Developers Site zu kopieren.

12voto

Trevor Mills Punkte 409

In WordPress gibt es auch die sehr praktische Funktion wp_mkdir_p die rekursiv eine Verzeichnisstruktur erstellt.

Quelle für die Referenz:

function wp_mkdir_p( $target ) {
    $wrapper = null;

    // Strip the protocol
    if( wp_is_stream( $target ) ) {
        list( $wrapper, $target ) = explode( '://', $target, 2 );
    }

    // From php.net/mkdir user contributed notes
    $target = str_replace( '//', '/', $target );

    // Put the wrapper back on the target
    if( $wrapper !== null ) {
        $target = $wrapper . '://' . $target;
    }

    // Safe mode fails with a trailing slash under certain PHP versions.
    $target = rtrim($target, '/'); // Use rtrim() instead of untrailingslashit to avoid formatting.php dependency.
    if ( empty($target) )
        $target = '/';

    if ( file_exists( $target ) )
        return @is_dir( $target );

    // We need to find the permissions of the parent folder that exists and inherit that.
    $target_parent = dirname( $target );
    while ( '.' != $target_parent && ! is_dir( $target_parent ) ) {
        $target_parent = dirname( $target_parent );
    }

    // Get the permission bits.
    if ( $stat = @stat( $target_parent ) ) {
        $dir_perms = $stat['mode'] & 0007777;
    } else {
        $dir_perms = 0777;
    }

    if ( @mkdir( $target, $dir_perms, true ) ) {

        // If a umask is set that modifies $dir_perms, we'll have to re-set the $dir_perms correctly with chmod()
        if ( $dir_perms != ( $dir_perms & ~umask() ) ) {
            $folder_parts = explode( '/', substr( $target, strlen( $target_parent ) + 1 ) );
            for ( $i = 1; $i <= count( $folder_parts ); $i++ ) {
                @chmod( $target_parent . '/' . implode( '/', array_slice( $folder_parts, 0, $i ) ), $dir_perms );
            }
        }

        return true;
    }

    return false;
}

0 Stimmen

Re "Rekursiv eine Verzeichnisstruktur erstellen" : Deutet dies darauf hin, dass vanilla PHP-Funktionen dies nicht tun können?

9voto

Progrower Punkte 353

Ich brauchte das Gleiche für eine Login-Seite. Ich musste ein Verzeichnis mit zwei Variablen erstellen.

Das $-Verzeichnis ist der Hauptordner, in dem ich einen weiteren Unterordner mit der Lizenznummer des Benutzers erstellen wollte.

include_once("../include/session.php");

$lnum = $session->lnum; // Users license number from sessions
$directory = uploaded_labels; // Name of directory that folder is being created in

if (!file_exists($directory . "/" . $lnum)) {
    mkdir($directory . "/" . $lnum, 0777, true);
}

5voto

Andreas Punkte 2701

Dies ist die modernste Lösung ohne Fehlerunterdrückung:

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

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