Pregunta Crea una carpeta si aún no existe


Me he encontrado con algunos casos con 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

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

Así que necesito agregar código a mi tema que busque la carpeta y la cree de otra manera.


503
2018-02-20 19:26


origen


Respuestas:


Prueba esto:

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

Tenga en cuenta que 0777 ya es el modo predeterminado para los directorios y aún puede ser modificado por la umask actual.


970
2018-02-20 19:28



Aquí está la pieza faltante. Debe pasar el indicador 'recursivo' como tercer argumento (booleano verdadero) en la llamada a mkdir de la siguiente manera:

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

105
2018-02-25 19:52



Algo un poco más universal ya que esto aparece 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 llegue 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.

Podría mejorarse proporcionando un nivel de detención, por lo que solo falla si va más allá de la carpeta de usuario o algo así y al incluir permisos.


58
2018-06-01 17:44



¿Qué tal un helper funciona así:

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

Regresará true si el directorio se creó con éxito o ya existe, y false si el directorio no pudo ser creado

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

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

48
2018-02-20 19:33



Recursivamente crear ruta de directorio:

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

Inspirado por Python os.makedirs()


21
2017-07-05 23:09



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

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

19
2017-09-14 06:35



Dentro de WordPress también está la muy útil función wp_mkdir_p que creará recursivamente una estructura de directorio.

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

7
2018-04-12 00:14



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

3
2017-08-12 00:30



Esta es la solución más actualizada sin supresión de errores:

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

1
2018-04-27 17:20