wake-up-neo.com

Erstellen Sie einen Ordner, falls er noch nicht vorhanden ist

Ich habe einige Fälle mit WordPress-Installationen mit Bluehost ausgeführt, bei denen ich Fehler in meinem WordPress-Design festgestellt habe, da der Upload-Ordner wp-content/uploads nicht vorhanden war.

Anscheinend erstellt das Installationsprogramm von Bluehost cPanel WP diesen Ordner nicht, obwohl dies von HostGator der Fall ist.

Daher muss ich meinem Design Code hinzufügen, der nach dem Ordner sucht und ihn ansonsten erstellt.

544
Scott B

Versuche 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 möglicherweise noch von der aktuellen umask geändert wird.

1074
Gumbo

Hier ist das fehlende Stück. Sie müssen das 'rekursive' Flag als drittes Argument (boolean true) in einem mkdir-Aufruf wie folgt übergeben:

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

Etwas universeller, da dies bei Google auftaucht. Während die Details spezifischer sind, ist der Titel dieser Frage allgemeiner.

/** 
 * 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 erfordert einen Pfad, möglicherweise mit einer langen Kette von nicht erstellten Verzeichnissen, und wechselt ein Verzeichnis weiter, bis es in ein vorhandenes Verzeichnis gelangt. Dann wird versucht, das nächste Verzeichnis in diesem Verzeichnis zu erstellen, und so lange fortfahren, bis alle Verzeichnisse erstellt wurden. Bei Erfolg wird true zurückgegeben.

Könnte verbessert werden, indem eine Stoppebene bereitgestellt wird, die nur fehlschlägt, wenn sie über einen Benutzerordner oder etwas anderes hinausgeht, und Berechtigungen enthält.

61
phazei

Was ist mit einer Helferfunktion wie folgt:

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

Es wird true zurückgegeben, 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 geben):

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

Schnellere Methode zum Erstellen eines Ordners:

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

Verzeichnispfad rekursiv anlegen:

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

Inspiriert von Pythons os.makedirs()

21
user

In WordPress gibt es auch die sehr nützliche Funktion wp_mkdir_p , die rekursiv eine Verzeichnisstruktur erstellt. 

Bezugsquelle: -

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;
}
7
Trevor Mills

Ich brauche dasselbe für eine Login-Site. Ich musste ein Verzeichnis mit zwei Variablen erstellen. Das $ -Verzeichnis ist der Hauptordner, in dem ich einen anderen Unterordner mit der Benutzerlizenznummer 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);
}
3
Progrower

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

if (!is_dir('path/to/directory')) {
    mkdir('path/to/directory');
}
2
Andreas
$upload = wp_upload_dir();
$upload_dir = $upload['basedir'];
$upload_dir = $upload_dir . '/newfolder';
if (! is_dir($upload_dir)) {
   mkdir( $upload_dir, 0700 );
}
0

So erstellen Sie einen Ordner, falls er noch nicht vorhanden ist

Berücksichtigen Sie die Umgebung der Frage.

  • WordPress.
  • Webhosting-Server.
  • Vorausgesetzt, dass Linux kein Windows ist, auf dem PHP ausgeführt wird.

Und zitiert aus: http://php.net/manual/de/function.mkdir.php

bool mkdir (Zeichenfolge $ pathname [ int $ mode = 0777 [ bool $ rekursive = FALSE [ Ressource $ context]]])

Manuell sagt, dass der einzige erforderliche Parameter der $pathname ist!

so können wir einfach kodieren:

<?php
error_reporting(0); 
if(!mkdir('wp-content/uploads')){
   // todo
}
?>

Erläuterung:

Wir müssen keine Parameter übergeben oder überprüfen, ob Ordner vorhanden sind, oder sogar Modusparameter übergeben, sofern dies nicht erforderlich ist. aus den folgenden Gründen:

  • Der Befehl erstellt den Ordner mit der Berechtigung 0755 (Standardberechtigung des freigegebenen Hosting-Ordners) oder 0777 der Standardeinstellung des Befehls.
  • mode wird bei Windows Hosting mit PHP ignoriert.
  • Der Befehl mkdir enthält bereits eine Überprüfung, wenn ein Ordner vorhanden ist. Wir müssen also nur die Rückgabe prüfen. Wahr | Falsch; und es ist kein Fehler, es ist nur eine Warnung und Warnung ist in Hosting-Servern standardmäßig deaktiviert.
  • Je nach Geschwindigkeit ist dies schneller, wenn die Warnung deaktiviert ist.

Dies ist nur eine weitere Möglichkeit, die Frage zu untersuchen und keine bessere oder optimalste Lösung zu fordern.

Getestet mit PHP7, Production Server, Linux

0
WPDev

Wenn Sie das Problem file_exists VS is_dir vermeiden möchten, empfehle ich Ihnen, nach hier zu suchen.

Ich habe dies versucht und es erstellt nur das Verzeichnis, wenn das Verzeichnis existiert nicht . Es ist egal, dass es eine Datei mit diesem Namen gibt.

/* Creates the directory if it does not exist */
$path_to_directory = 'path/to/directory';
if (!file_exists($path_to_directory) && !is_dir($path_to_directory)) {
    mkdir($path_to_directory, 0777, true);
}
0
joaorodr84

Wir sollten unseren Code immer modularisieren, und ich habe das gleiche geschrieben, überprüfen Sie es unten ..... Wir überprüfen zuerst das Verzeichnis, und wenn das Verzeichnis nicht vorhanden ist, erstellen wir das Verzeichnis.

$boolDirPresents = $this->CheckDir($DirectoryName);

if (!$boolDirPresents) {
        $boolCreateDirectory = $this->CreateDirectory($DirectoryName);
        if ($boolCreateDirectory) {
        echo "Created successfully";
      }
  }

function CheckDir($DirName) {
    if (file_exists($DirName)) {
        echo "Dir Exists<br>";
        return true;
    } else {
        echo "Dir Not Absent<br>";
        return false;
    }
}

function CreateDirectory($DirName) {
    if (mkdir($DirName, 0777)) {
        return true;
    } else {
        return false;
    }
}
0
Aditya Malviya

Sie können auch versuchen:

$dirpath = "path/to/dir";
$mode = "0777";
is_dir($dirpath) || mkdir($dirpath, $mode, true);
0
simhumileco
if (!is_dir('path_directory')) {
    @mkdir('path_directory');
}
0
Mayur Kukadiya

Sie müssen zuerst überprüfen, ob das Verzeichnis existiert file_exists('path_to_directory')

Verwenden Sie dann mkdir(path_to_directory), um ein Verzeichnis zu erstellen

mkdir (string $ pathname [ int $ mode = 0777 [ bool $ recursive = FALSE [ resource $ context]]]): bool

Mehr über mkdir () hier

Vollständiger Code hier:

$structure = './depth1/depth2/depth3/';
if (!file_exists($structure)) {
    mkdir($structure);
}
0
Nasir Khan