2010-02-20 19 views
469

Me he encontrado con unos pocos casos con las instalaciones de WordPress con Bluehost donde he encontrado errores con mi tema de WordPress porque la carpeta de carga wp-content/uploads no estaba presente.Crear una carpeta si no existe

Aparentemente, el instalador Bluehost cPanel WP no crea esta carpeta, aunque HostGator sí.

Por lo tanto, debo agregar un código a mi tema que busque la carpeta y la cree de otro modo.

Respuesta

910

Prueba esto:

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

Tenga en cuenta que 0777 ya es el modo por defecto para los directorios y todavía pueden ser modificados por la máscara de usuario actual.

+7

se ha perdido la bandera 'recursiva' - véase la respuesta de Satish. –

+83

is_dir() es un poco más rápido que file_exists() –

+26

@YuryPliashkou Sí, tal vez, pero no funciona si ya hay un * archivo * con ese nombre. – Gumbo

44

¿Qué pasa con una función de ayuda de esta manera:

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

Se volverá true si el directorio se ha creado correctamente o existe ya, y false si no se pudo crear el directorio.

Un mejor alternativa es esto (no debe dar ninguna advertencia):

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

Si quita el '@' y lo reemplaza por un cheque apropiado 'is_dir', mi upvote es suyo :) Puntos de bonificación para comprobar si el directorio padre' is_writable() 'para una función de ayudante hermético. –

+0

Usar @ para suprimir los errores es un golpe de rendimiento. Es mejor comprobar que ya no existe como Gumbo – Simon

+0

Bien, eliminó la supresión de errores. – AndiDog

56

Algo un poco más universal ya que esto sale en Google. Si bien los detalles son más específicos, el título de esta pregunta es más universal.

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

Esto tomará un camino, posiblemente con una larga cadena de directorios no creados, y seguir subiendo un directorio hasta que llega a un directorio existente. Luego intentará crear el siguiente directorio en ese directorio, y continuará hasta que haya creado todos los directorios. Devuelve verdadero si tiene éxito.

Se podría mejorar proporcionando un nivel de detención por lo que simplemente falla si va más allá de la carpeta de usuario o algo así y al incluir permisos.

+0

por alguna razón este código devuelve "página no encontrada", aunque otras respuestas funcionan ... – Armand

+0

@phazei Recibo una llamada a una función no definida debido a la línea $ return = createPath ($ camino_previo); – Battousai

+0

Gracias @phazei :) – anhlee

98

Aquí está la pieza faltante. Tiene que pasar la bandera 'recursiva' como tercer argumento (booleano verdadero) en la llamada mkdir así:

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

el indicador 'recursivo' es el tercer argumento booleano 'verdadero' – ahnbizcad

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

¿Supresión de error? ¿Por qué? – canadiancreed

+3

Con la supresión de errores, no hay necesidad de verificar que el directorio existe – neoascetic

+1

es mejor manejar los errores que suprimirlos. Si esto falla, nunca sabrá por qué de esto, y tendrá que investigarlo –

3

necesito lo mismo para un sitio de inicio de sesión. Necesitaba crear un directorio con dos variables. El directorio $ es la carpeta principal en la que quería crear otra subcarpeta con el número de licencia de los usuarios.

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

Dentro de WordPress también existe la funcionalidad muy útil wp_mkdir_p que recurrentemente crear una estructura de directorios.

Fuente de referencia: -

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

recursiva crear ruta del directorio:

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

Inspirado por el pitón os.makedirs()

1

Ésta es la solución más arriba-hasta la fecha sin supresión de error:

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

Usted puede tratar también:

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

más rápida manera de crear una carpeta:

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