2010-02-20 18 views
469

Ich habe in einigen Fällen mit WordPress-Installationen mit Bluehost, wo ich Fehler mit meinem WordPress-Theme festgestellt habe, da der Upload-Ordner wp-content/uploads nicht vorhanden war.Erstellen Sie einen Ordner, wenn es nicht bereits existiert

Anscheinend erstellt der Bluehost cPanel WP Installer diesen Ordner nicht, obwohl HostGator dies tut.

Also muss ich meinem Thema Code hinzufügen, der nach dem Ordner sucht und ihn sonst erstellt.

Antwort

910

Versuchen Sie folgendes:

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

Beachten Sie, dass 0777 ist bereits der Standardmodus für Verzeichnisse und immer noch von der aktuellen umask modifiziert werden kann.

+7

Sie verpassten die 'rekursive' Flag - siehe Satish Antwort. –

+83

is_dir() ist etwas schneller, als file_exists() –

+26

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

44

Was ist mit einer Hilfsfunktion wie folgt aus:

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ück, wenn das Verzeichnis erfolgreich erstellt wurde oder bereits vorhanden ist, und false wenn das Verzeichnis konnte nicht erstellt werden.

A besser Alternative ist dies (keine Warnungen geben sollte):

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

Wenn Sie das '@' entfernen und es durch eine richtige 'is_dir'-Prüfung ersetzen, ist mein Upvote Ihr :) Bonuspunkte für die Überprüfung, ob das Elternverzeichnis' is_writable() 'für eine wasserdichte Helferfunktion ist. –

+0

Die Verwendung von @ zur Unterdrückung der Fehler ist ein Leistungseinbruch. Besser zu prüfen, es existiert nicht bereits wie Gumbo – Simon

+0

Okay, entfernt die Fehlerunterdrückung. – AndiDog

56

etwas ein bisschen mehr universal, da dies kommt auf google. Während die Details genauer 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 wird einen Weg nehmen, möglicherweise mit einer langen Kette von uncreated Verzeichnissen und halten ein Verzeichnis gehen, bis es zu einem bestehenden Verzeichnis erhält. Dann wird versucht, das nächste Verzeichnis in diesem Verzeichnis zu erstellen und fortzufahren, bis alle Verzeichnisse erstellt sind. Wenn es erfolgreich ist, gibt es true zurück.

Könnte verbessert werden, indem eine Stopp-Ebene, so dass es nur fehlschlägt, wenn es über Benutzerordner oder etwas geht und durch die Einbeziehung von Berechtigungen.

+0

aus irgendeinem Grund gibt dieser Code "Seite nicht gefunden" zurück, obwohl andere Antworten funktionieren ... – Armand

+0

@ phazei Ich bekomme einen Aufruf an undefinierte Funktion wegen der Zeile $ return = createPath ($ prev_path); – Battousai

+0

Danke @phazei :) – anhlee

98

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

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

der "rekursive" Flag ist das boolesche 3. Argument 'true' – ahnbizcad

-1
if (!is_dir('path_directory')) { 
    @mkdir('path_directory'); 
} 
+2

Fehler Unterdrückung? Warum? – canadiancreed

+3

Mit der Fehlerunterdrückung ist es nicht notwendig zu überprüfen, ob das Verzeichnis existiert – neoascetic

+1

es ist besser, Fehler zu behandeln, als sie zu unterdrücken. Wenn dies fehlschlägt, werden Sie nie wissen, warum dies von diesem, und muss es –

3

Ich brauche die gleiche Sache für eine Login-Seite. 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); 
} 
6

In Wordpress gibt es auch die sehr praktische Funktion wp_mkdir_p die rekursiv eine Verzeichnisstruktur schaffen.

Quelle als 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; 
} 
17

Recursively Verzeichnispfad erstellen:

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

von Python inspiriert os.makedirs()

1

Dies ist die up-to-date-Lösung ohne Fehlerunterdrückung:

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

Sie können auch versuchen:

$dirpath = "path/to/dir"; 
$mode = "0777"; 
is_dir($dirpath) || mkdir($dirpath, $mode, true); 
13

Schneller Weg Ordner zu erstellen:

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