2012-07-12 33 views
6

Duplicar posible:
PHP uploading script - create folder automaticallyPHP mkdir() Función - Si la carpeta existe

Tengo un script PHP que crea una carpeta basada en una forma. Me pregunto si hay alguna forma de NO crear y reemplazar esa carpeta si ya existe.

<?php 
mkdir("QuickLinks/$_POST[contractno]"); 
?> 
+0

¿Qué intentas lograr exactamente? ¿Qué hace tu programa? –

+0

El programa crea una carpeta basada en la entrada de un formulario y luego copia una carpeta de plantilla en la nueva carpeta. Me pregunto si también hay una manera de decirle a la secuencia de comandos que si la carpeta ya está allí; no copiar nada? Es un proyecto interno, se necesita una contraseña para acceder a la página web. – ItsJoeTurner

Respuesta

15

Puede utilizar is_dir:

<?php 
$path = "QuickLinks/$_POST[contractno]"; 
if(!is_dir($path)){ 
    mkdir($path); 
} 
?> 
2

En general:

$dirname = "whatever"; 
if (!is_dir($dirname)) { 
    mkdir($dirname); 
} 

En particular: tenga mucho cuidado al hacer operaciones del sistema de archivos (o cualquier otro tipo de sensible) que involucran la entrada del usuario! El ejemplo actual (crear un directorio) no deja mucha superficie de ataque abierta, pero validar la entrada nunca puede doler.

1

Utilice is_dir-function de PHP para comprobar si ya hay un directorio y llamar a la función mkdir solo si no hay una.

2

Usted puede tratar de:

<?php 
    if (!is_dir("QuickLinks/$_POST[contractno]")) 
     mkdir("QuickLinks/$_POST[contractno]"); 
?> 
+0

Esto parece haber funcionado. ¿Hay alguna manera de hacer esto para copiar una carpeta? Si la carpeta ya existe, ¿entonces no copia nada? – ItsJoeTurner

+0

Sí, esto debería funcionar: ' '. Si hay un problema con la función shell_exec(), reemplácela con alguna otra función de copia inspirada de [esto] (http://stackoverflow.com/questions/2050859/copy-entire-contents-of-a-directory-to-another -usando-php) tema. –

0

Por qué algunas reglas de validación (expresiones regulares) aquí antes de usar variable posteriormente para crear el directorio!

if(!file_exists("QuickLinks/$_POST[contractno]")) 
    mkdir("QuickLinks/$_POST[contractno]"); 
+0

file_exists no diferencia entre archivos y directorios, por lo que un archivo con el nombre que está buscando producirá un falso verdadero. is_dir comprueba si existe Y si es un directorio – hellsgate

+1

@hellsgate: ¿Cuál es el mejor enfoque en tales casos? No puede crear el directorio si existe un archivo o un socket con nombre bajo ese mismo nombre. Así que 'is_dir' suena como el enfoque más exacto, pero puede conducir a falsos negativos y errores adicionales. Puramente ficticio. Pero el código de reserva debe invocarse para los archivos * y * existentes. – mario

+0

@mario: Buen punto. Para este escenario, ahora me doy cuenta de que file_exists es la mejor opción debido a los motivos que enumera. – hellsgate

2

Uso is_dir para comprobar si la carpeta existe

$dir = "/my/path/to/dir"; 
if (!is_dir($dir)) { 
    if (false === @mkdir($dir, 0777, true)) { 
     throw new \RuntimeException(sprintf('Unable to create the %s directory', $dir)); 
    } 
} 

Atención a la entrada incontrolada, es muy peligroso!

Cuestiones relacionadas