Crear una carpeta si aún no existe

Me he encontrado con algunos casos de instalaciones de WordPress con Bluehost en los que me he encontrado con errores con mi tema de WordPress porque la carpeta uploads wp-content/uploads no estaba presente.

Al parecer, el instalador de Bluehost cPanel WP no crea esta carpeta, aunque HostGator hace.

Así que tengo que añadir código a mi tema que comprueba la carpeta y la crea de lo contrario.

Solución

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 puede ser modificado por la umask actual.

Comentarios (10)

Algo un poco más universal ya que esto sale en google. Aunque 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á una ruta, posiblemente con una larga cadena de directorios no creados, y seguirá subiendo un directorio hasta llegar a un directorio existente. Entonces intentará crear el siguiente directorio en ese directorio, y continuará hasta que haya creado todos los directorios. Devuelve true si tiene éxito.

Podría mejorarse proporcionando un nivel de parada para que sólo falle si va más allá de la carpeta del usuario o algo así, e incluyendo los permisos.

Comentarios (3)

¿Qué tal una función de ayuda como esta?

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

Devolverá true si el directorio fue creado con éxito o ya existe, y false si el directorio no pudo ser creado.

Una mejor alternativa es esta (no debería dar ninguna advertencia):

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