Hogar / Descripción general de Linux / Php funciona: cree una carpeta si aún no existe. Función mkdir en PHP, descripción y ejemplos Php creando una carpeta si no existe

Php funciona: cree una carpeta si aún no existe. Función mkdir en PHP, descripción y ejemplos Php creando una carpeta si no existe

La función mkdir() crea una nueva carpeta en el directorio especificado. Si la creación es exitosa, devuelve Verdadero. Al crear una nueva carpeta, puede establecer derechos de acceso utilizando el parámetro $mode. Al configurar $recursive en True, puede crear varias subcarpetas.

PHP versión 4 y superior.

función bool mkdir(cadena $nombre de ruta [, int $modo [, bool $recursivo [, recurso $contexto]]])

parámetros de la función mkdir

$ nombre de rutaRuta al directorio a crear.
modo $Los derechos a la carpeta creada se asignan como un valor octal con un cero obligatorio en primer lugar (0777). Aparte del primer cero, los números representan niveles de acceso para el propietario, para el grupo del propietario y para todos los demás.
El nivel de acceso está determinado por los números:
0 – acceso denegado;
1 – acceso de lectura;
2 – acceso de escritura;
4 – acceso de ejecución.
La mayoría de las veces, los derechos se especifican como una cantidad compuesta, por ejemplo:
7 – acceso completo (1+2+4);
5 – lectura y ejecución (1+4).
El valor predeterminado es 0777.
$recursivoUn parámetro booleano que determina si se pueden crear subdirectorios anidados.
$ contextoSe utiliza cuando se trabaja con transmisiones. Agregado en PHP 5.0.0.

Ejemplos de uso de la función mkdir

mkdir( "nueva carpeta" );

mkdir( "../nuevacarpeta" ); //un nivel abajo

mkdir("/carpeta1/carpeta2/nuevacarpeta"); // ruta completa

mkdir( "nueva carpeta", 0777); // crear una carpeta con derechos asignados

Si necesita crear varias subcarpetas, debe configurar $recursive = True.

mkdir("carpeta1/carpeta2/nuevacarpeta", 0777, Verdadero); //creando una carpeta en el directorio actual


La publicación de este artículo está permitida únicamente con un enlace al sitio web del autor del artículo.

En este artículo describiré una opción para solucionar el problema de crear carpetas con usando php en modo seguro.
Para crear una carpeta en PHP, existe la función mkdir() estándar, pero en la mayoría de los casos resulta inútil y mucha gente lo sabe, pero no mucha gente sabe que se puede solucionar este problema.
Todo es muy simple, necesitas crear carpetas usando el incorporado funciones php FTP.
A continuación escribo sobre esto con más detalle.

Problemas con mkdir() al crear una carpeta.
Como sabes, si está habilitado en php modo seguro(safe_mode = activado), entonces la creación de carpetas (directorios) usando mkdir() no funcionará. Para ser más precisos, puede crearla, pero será imposible seguir utilizando esta carpeta. No podrá cargar archivos en esta carpeta, no podrá cambiarle el nombre y no podrá eliminarla, incluso si inicia sesión mediante FTP (en algunos casos puede eliminar mediante FTP).

El modo seguro está habilitado de forma predeterminada en todos los servidores y todos los proveedores de hosting. Si no tiene la opción de desactivar el Modo seguro, existe otra salida.

Creando carpetas en php usando FTP.
Casi todos los servidores y hosting tienen habilitado el soporte ftp en php.
Con la ayuda de estas funciones solucionaremos el problema de crear la carpeta mkdir().
Un ejemplo de creación de una carpeta a través de FTP.

$conn_id = @ ftp_connect ("ftp.server.ru", 21, 5); // conectarse al servidor FTP
si($conn_id) // si la conexión al servidor fue exitosa, continuar
{
$login_result = @ftp_login($conn_id, "usuario", "contraseña"); // ingresa tu nombre de usuario y contraseña para FTP
si($login_result) // si el servidor aceptó la contraseña de inicio de sesión, continúa
{
// ahora necesitas jugar con el modo pasivo, activarlo o desactivarlo (VERDADERO, FALSO)
// si otras funciones ftp no funcionan correctamente, intenta cambiar este parámetro (VERDADERO o FALE)
ftp_pasv($conn_id, VERDADERO); // en este caso el modo pasivo está habilitado
ftp_mkdir($conn_id, "1/2/3"); // y la propia creación de la carpeta
}
}
ftp_close($conn_id); // y cerrar la conexión FTP
?>
Ahora, no es un gran comentario sobre el código.
La primera línea se conecta al servidor FTP. Normalmente, para conectarse a un servidor FTP local, basta con especificar localhost como servidor, pero también puede especificar la dirección completa.
Si el modo pasivo está habilitado o deshabilitado depende de la configuración de FTP.

Al crear una carpeta, tenga cuidado, la carpeta se crea desde la raíz de inicio de sesión FTP. Es decir, los caminos aquí son diferentes de los caminos. sistema de archivos y la carpeta se crea como se ve a través de FTP.
Si al crear una carpeta especifica varios archivos adjuntos, como en mi ejemplo "1/2/3", en este caso se crearán todas las carpetas que faltan. Si no existe la carpeta "1", se creará la misma, y ​​en ella se creará la carpeta "2", y en ella se creará la carpeta "3". Si ya existen carpetas intermedias, sólo se crearán las que faltan.
Antes de crear una carpeta, puede moverse a una carpeta, por ejemplo


Y después de esta función puedes crear una carpeta. Si la ruta a la carpeta se especifica como "2/3" sin la barra diagonal inicial, entonces la carpeta se creará en relación con la carpeta en la que nos encontramos actualmente. Es decir, se creará la carpeta "1/2/3"


Si especifica una barra diagonal inicial (/1/2/3) al crear una carpeta, la carpeta se creará desde la raíz FTP, independientemente de a qué carpeta se haya movido.

Comentarios

14/10/2009 Serguéi
todo lo ingenioso es simple :)

12.12.2009 Víctor
Gracias, todo funciona, pero en el cliente ftp las carpetas creadas no son visibles inmediatamente, hay que reiniciarlo, es decir. No se limite a desconectarse del servidor y volver a conectarse, sino que cierre el programa y ejecútelo nuevamente (yo uso FileZilla Client).

14/12/2009 Administrador
creo que eso es todo Clientes FTP archivos y carpetas de caché. Por ejemplo, en Total Commander hay un botón especial de "actualización" para este tipo de asuntos; es una pena que FileZilla no lo tenga.

24/01/2010 Alejandro
¿Cómo es que no existe tal cosa en FileZilla? Tengo la versión 3.2.2, ya tiene aproximadamente un año y existe esa función y, hasta donde recuerdo, ¡siempre ha existido!

27/08/2010 Vitaly
Las carpetas se crean con 755 a la derecha, pero necesitas 777.
En la etapa de creación, ¿es posible configurar de alguna manera qué derechos se creará la carpeta a través de FTP?

27/08/2010 Administrador
Vitaly, hay una función para esto.
ftp_chmod($conn_id, 0777, $archivo)
después de crear una carpeta o archivo, úselo

28/08/2010 Vitaly
¡Gracias, administrador!

12/09/2010 andréi
Disculpe por qué no creo varios directorios, es decir:

12/06/2011 Ilya
Algo no va bien. El servidor emite:
Advertencia: ftp_close() espera que el parámetro 1 sea un recurso, booleano dado en /home/bos/p/h/p/phpscripts/public_html/formf.php en la línea 19

15/06/2011 Víctor
Ilya, escribe que el primer parámetro que pasas a la función ftp_close no es correcto

29/06/2011 alexey
El mismo problema que Andrey.
(no se crean varios directorios)
ftp_mkdir ($conn_id, "1"); // así es como funciona
pero así ftp_mkdir ($conn_id, "1/2/3"); // no funciona.
???

27/07/2011 Víctor
Alexey, extraño, lo comprobé, me crea varias carpetas.
Tal vez algún modo complicado esté habilitado en el servidor, entonces necesita crear carpetas una por una, primero crear la carpeta 1, luego ingresarla y crear la carpeta 2 en ella, luego ingresar la carpeta 2 y crear 3 en ella...

07/11/2011 k1-801 (Dmitry es posible)
Y eliminar carpetas, según tengo entendido, a través de
rmdir_ftp($conn_id, $dir);
¿Entonces?

Y, por cierto, por alguna razón no me crea una carpeta (y no escribe errores... extraño...)

10/03/2012 YA
Gracias, de lo contrario me atormentaba esta pregunta.
y lo perdonas todo y lo principal es que funciona

29/05/2012 Miguel
Por supuesto que lo siento. ¿Dónde debería escribir este código? De lo contrario, no soy nada bueno en eso, pero realmente necesito crear una carpeta))

04/07/2012 Nomaq
Algo anda mal conmigo... la primera vez el código se salta, la segunda vez dice que dicha carpeta ya existe... parece que se está creando, pero no es visible incluso después de reiniciar FTP((((
y también, necesito crear una carpeta que no esté en la misma carpeta donde está el archivo PHP, sino retroceder un paso y luego ingresar a otra carpeta y crearla allí... algo como esto:
../carpeta1/nueva carpeta aquí
por favor ayuda, si no es difícil) gracias)

04/07/2012 Nomaq
Descubrí las formas))) gracias en general por el artículo, es raro que alguien explique correctamente cómo)))

27/01/2013 CiliZ
Bien hecho, respeto por el artículo.

05/06/2013 Vasili
La carpeta corporativa es el elemento principal. identidad corporativa empresas. Es un producto para adjuntar pequeñas cantidades de documentos y materiales en papel. Las carpetas se utilizan tanto dentro de una empresa, para almacenar y mover documentación, como con fines publicitarios. Más detalles en el sitio web: www.logodesigner.ru/papki

eliminar etiquetas (12)

Me he encontrado con varios casos con instalaciones de WordPress desde Bluehost en los que encontré errores en mi tema de WordPress porque faltaba la carpeta de cargas wp-content/uploads.

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

Entonces necesito agregar código a mi tema que verifique la carpeta y la cree de otra manera.

Respuestas

Prueba esto:

If (!file_exists("ruta/al/directorio")) ( mkdir("ruta/al/directorio", 0777, verdadero); )

Tenga en cuenta que 0777 ya es el modo predeterminado para directorios y aún puede cambiarse mediante la máscara de usuario actual.

WordPress también tiene una función muy útil wp_mkdir_p que creará de forma recursiva una estructura de directorios.

Fuente de referencia: -

Función wp_mkdir_p($target) ( $wrapper = null; // elimina el protocolo if(wp_is_stream($target)) ( list($wrapper, $target) = explotar("://", $target, 2); ) // de php.net/mkdir notas aportadas por el usuario $target = str_replace("//", "/", $target // colocar el contenedor nuevamente en el objetivo if($wrapper !== null) ( $target); ); = $wrapper . "://" . $target; ) // el modo seguro falla con una barra diagonal en ciertas versiones de PHP. if (empty($target)) $target = "/"; if (file_exists($target)) devuelve @is_dir($target); que existe y lo hereda. " != $target_parent && ! is_dir($target_parent)) ( $target_parent = dirname($target_parent); ) // Obtiene los bits de permiso. if ($stat = @stat($target_parent)) ( $dir_perms = $stat[ "mode"] & 0007777 ) else ($dir_perms = 0777; ) if (@mkdir($target, $dir_perms, true)) ( // Si se establece una umask que modifica $dir_perms, tendremos que volver a configure $dir_perms correctamente con chmod() if ($dir_perms != ($dir_perms & ~umask())) ( $folder_parts = explode( "/", substr($target, strlen($target_parent) + 1));<= count($folder_parts); $i++) { @chmod($target_parent . "/" . implode("/", array_slice($folder_parts, 0, $i)), $dir_perms); } } return true; } return false; }

para ($i = 1; $i

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

Include_once("../include/session.php"); $lnum = $sesión->lnum; //Número de licencia de usuario de las sesiones $directory = uploaded_labels; // Nombre del directorio en el que se está creando esa carpeta if (!file_exists($directorio."/".$lnum)) ( mkdir($directorio."/".$lnum, 0777, true); )

Algo más genérico como aparece en google. Si bien los detalles son más específicos, el título de esta pregunta es más genérico.

/** * crear recursivamente una ruta de directorio larga */ function createPath($path) ( if (is_dir($path)) devuelve verdadero; $prev_path = substr($path, 0, strrpos($path, "/", - 2) + 1); $return = createPath($prev_path); retorno ($return && is_writable($prev_path)) mkdir($ruta): falso;

Podría mejorarse proporcionando un nivel de parada para que simplemente falle si sale de la carpeta del usuario o algo así, y habilitando permisos.

Para crear una carpeta si aún no existe

Consideración de la cuestión ambiental.

  • WordPress.
  • Servidor de alojamiento web.
  • Suponiendo que Linux no esté ejecutando PHP.

booleano mkdir(cadena $nombreruta[, int $modo=0777[, bool $recursivo=FALSE[, recurso$contexto]]])

¡El manual indica que el único parámetro requerido es $pathname!

entonces podemos simplemente codificar:

Explicación:

No necesitamos pasar ningún parámetro ni verificar si la carpeta existe o incluso el parámetro del modo de transferencia si es necesario; por las siguientes razones:

  • El comando creará una carpeta con un permiso de 0755 (el permiso predeterminado para una carpeta pública) o 0777, el permiso predeterminado para el comando.
  • El modo se ignora en Host de Windows que ejecuta PHP .
  • El comando mkdir tiene una verificación incorporada si la carpeta existe; por lo que sólo necesitamos comprobar si devuelve True | FALSO; Y esto no es un error, es sólo una advertencia y la advertencia está deshabilitada en los servidores de alojamiento de forma predeterminada.
  • Dependiendo de la velocidad es más rápido si el aviso está desactivado.

Ésta es otra forma de ver la cuestión y no afirmar cuál es la solución mejor u óptima.

Probado en PHP7, servidor de producción, Linux

También puedes probar:

$dirpath = "ruta/al/dir"; $modo = "0777"; is_dir($rutadir) || mkdir($dirpath, $modo, verdadero);

If (!is_dir("ruta_directorio")) ( @mkdir("ruta_directorio"); )

Una forma más rápida de crear una carpeta:

If (!is_dir("ruta/al/directorio")) ( mkdir("ruta/al/directorio", 0777, verdadero); )

tu lo haras

Printf("Hola %s,
", $nombre);

antes de la instalación galletas, lo cual está prohibido. No puedes enviar ningún dato antes de los encabezados, ni siquiera una línea vacía.

PHP tiene una única función: mkdir(), que permite crear directorios en el servidor del sitio web, que a veces son tan necesarios en el hogar. Por ejemplo, al crear un nuevo material, necesita crear una carpeta para él, donde, nuevamente usando su CMS, cargará todos los archivos necesarios.

Mkdir("/ruta/a/mi/dir", 0700);

Aquellos. en un directorio determinado creamos una nueva carpeta y, por ejemplo, configuramos su modo en 0700, por ejemplo, para poder escribir archivos en la carpeta, cambiamos el modo a 0777.

Pero aquí es donde surge el problema con mkdir(). Al hacer esto secuencia de comandos php cuando la función del servidor modo seguro está habilitada, se verifica el propietario (UID) y si el propietario del script y la carpeta no coinciden, es posible que no pueda, por ejemplo, escribir un archivo en el directorio creado, eliminar un archivo que contiene o, por ejemplo, a través de FTP, no podrá eliminar la carpeta en sí.

Pero hay una solución más elegante a este problema, sin tener que pedirle al proveedor de alojamiento que desactive la función modo_seguro (esta función está habilitada en absolutamente todos los sitios de alojamiento de forma predeterminada, para garantizar la seguridad). Básicamente, los servicios de hosting pagos también brindan acceso a ftp, y esto es con lo que comenzaremos.

$conn_ftp = @ftp_connect("su_servidor_ftp", 21, 5);

La primera variable de la función es la dirección de su servidor ftp, la segunda es el puerto en el que se conecta a ftp y la última es el tiempo de espera de conexión permitido. Un poco sobre el tiempo de espera, es necesario para operaciones de red posteriores; si no lo ingresa, el valor predeterminado se establece en 90 segundos. Después de la conexión, comprobamos si se realizó correctamente y enviamos el nombre de usuario y la contraseña:

If($conn_ftp) // la conexión fue exitosa ($login_result = @ftp_login($conn_ftp, "user", "pass"); // ingresa tu nombre de usuario y contraseña para FTP if($login_result) // se aprobó la verificación de nombre de usuario y contraseña éxito(ftp_pasv($conn_ftp, VERDADERO);))

Después de verificar el nombre de usuario y la contraseña, debemos decidir el modo pasivo y configurarlo en VERDADERO o FALSO; esto es necesario si otras funciones de FTP no funcionan correctamente. Ahora después de definir el modo pasivo, podemos crear nuestras carpetas, describiré todas las funciones que pueden serte útiles en el futuro:

$archivo = ftp_mkdir($conn_ftp, "public_html/materials/345"); //Creando el directorio 345 en la carpeta de materiales, si la carpeta de materiales no existe, //también se creará, lo mismo con la carpeta public_html (este directorio //está indicado para que puedas ver la ruta completa, sino es solo una carpeta con el sitio) ftp_chdir($conn_ftp, "public_html/materials"); //Si definitivamente tienes una carpeta de materiales, entonces no tienes que escribir la //ruta completa, simplemente puedes ir a ella primero y luego crear una carpeta 345 en ella usando //el siguiente código ftp_mkdir ($conn_ftp, "345") ftp_chmod($ conn_ftp, 0777, $archivo); //Todas las carpetas se crean con el modo 0755 de forma predeterminada, este comando le permitirá // cambiarlo a 0777, lo que le permitirá agregar archivos a la carpeta creada.

Ahora daré un ejemplo completo del código de trabajo para que puedas ver cómo se ve todo, por ejemplo, el mío:

$dir_name = tiempo(); //Aquí creo el nombre de la carpeta según la hora en que se inició el script $conn_ftp = @ftp_connect("your_ftp_server", 21, 5); if($conn_ftp) // la conexión fue exitosa ($login_result = @ftp_login($conn_ftp, "user", "pass"); // ingresa tu nombre de usuario y contraseña para FTP if($login_result) // se aprobó la verificación de nombre de usuario y contraseña éxito ( ftp_pasv ($conn_ftp, TRUE); ftp_chdir ($conn_ftp, "public_html/materials"); ftp_mkdir ($conn_ftp, $dir_name); ftp_chmod($conn_ftp, 0777, $dir_name); ) )

También vale la pena decir un poco sobre la especificación de directorios al crear; si especifica una barra al principio, la carpeta se creará en relación con la raíz ftp. Cuando se conecta a un servidor FTP, siempre se conecta a la raíz, así que tenga esto en cuenta.