2011-03-24 8 views
239

Quiero crear un directorio si no existe.¿Cómo puedo verificar si existe un directorio a través de PHP?

¿Está utilizando is_dir suficiente para tal fin?

if (!is_dir($dir)) { 
    mkdir($dir);   
} 

O debería combinar con is_dirfile_exists?

if (!file_exists($dir) && !is_dir($dir)) { 
    mkdir($dir);   
} 
+3

El operador booleano O debe ser AND, y en PHP está escrito como && –

+12

@IvoRenkema PHP también admite 'o' /' y 'además de' || '/' && '. –

+1

El operador '&&' no es útil aquí, porque, si el archivo no existe ('! File_exists ($ dir) == true'), seguro que no es un directorio. Y si el archivo existe, '! Is_dir ($ dir)' no se marcará, porque '! File_exists ($ dir)' devolverá 'false' y' && 'operator es [short-circuit] (http: // php. net/manual/es/language.operators.logical.php). –

Respuesta

158

Ambos devolverían la verdad en los sistemas Unix: en Unix, todo es un archivo, incluidos los directorios. Pero para comprobar si se toma ese nombre, debe verificar ambos. Puede haber un archivo regular llamado 'foo', que le impediría crear un nombre de directorio 'foo'.

+28

no se olvide de comprobar si is_writable también – Drewdin

+5

@Drewdin le gustaría comprobar el padre para 'is_writable' ¿verdad? –

105
$dirname = $_POST["search"]; 
$filename = "/folder/" . $dirname . "/"; 

if (!file_exists($filename)) { 
    mkdir("folder/" . $dirname, 0777); 
    echo "The directory $dirname was successfully created."; 
    exit; 
} else { 
    echo "The directory $dirname exists."; 
} 
+45

Mucho de lo que dice el eco ... – kay

+12

teniendo en cuenta que toma entrada de entrada y lo usa tal como está, además hace 0777 dir, prolly no es seguro en absoluto; P – sEver

+1

Más en serio, $ dirname podría desinfectarse y el permiso podría establecerse en 0755 Agregue a eso algunas directivas .htaccess. Hay algunas recomendaciones adicionales en OWASP: https://www.owasp.org/ –

3
$year = date("Y"); 
$month = date("m"); 
$filename = "../".$year; 
$filename2 = "../".$year."/".$month; 

if(file_exists($filename)){ 
    if(file_exists($filename2)==false){ 
     mkdir($filename2,0777); 
    } 
}else{ 
    mkdir($filename,0777); 
} 
+1

Puede verificar la ruta completa y si no existe crearla con mkdir recursive: if (! File_exists ($ filename2)) {mkdir ($ filename2, 0777, true); } Además, tu código nunca creará la ruta completa si $ filename no existe ... –

13

Creo realpath() puede ser la mejor manera de validar si un camino existe http://www.php.net/realpath

Aquí es una función de ejemplo:

<?php 
/** 
* Checks if a folder exist and return canonicalized absolute pathname (long version) 
* @param string $folder the path being checked. 
* @return mixed returns the canonicalized absolute pathname on success otherwise FALSE is returned 
*/ 
function folder_exist($folder) 
{ 
    // Get canonicalized absolute pathname 
    $path = realpath($folder); 

    // If it exist, check if it's a directory 
    if($path !== false AND is_dir($path)) 
    { 
     // Return canonicalized absolute pathname 
     return $path; 
    } 

    // Path/folder does not exist 
    return false; 
} 

versión corta de la misma función

<?php 
/** 
* Checks if a folder exist and return canonicalized absolute pathname (sort version) 
* @param string $folder the path being checked. 
* @return mixed returns the canonicalized absolute pathname on success otherwise FALSE is returned 
*/ 
function folder_exist($folder) 
{ 
    // Get canonicalized absolute pathname 
    $path = realpath($folder); 

    // If it exist, check if it's a directory 
    return ($path !== false AND is_dir($path)) ? $path : false; 
} 

ejemplos salida

<?php 
/** CASE 1 **/ 
$input = '/some/path/which/does/not/exist'; 
var_dump($input);    // string(31) "/some/path/which/does/not/exist" 
$output = folder_exist($input); 
var_dump($output);    // bool(false) 

/** CASE 2 **/ 
$input = '/home'; 
var_dump($input); 
$output = folder_exist($input);   // string(5) "/home" 
var_dump($output);    // string(5) "/home" 

/** CASE 3 **/ 
$input = '/home/..'; 
var_dump($input);    // string(8) "/home/.." 
$output = folder_exist($input); 
var_dump($output);    // string(1) "/" 

uso

<?php 

$folder = '/foo/bar'; 

if(FALSE !== ($path = folder_exist($folder))) 
{ 
    die('Folder ' . $path . ' already exist'); 
} 

mkdir($folder); 
// Continue do stuff 
+2

Para cualquiera que se encuentre con esto, creo que el camino real almacena en caché las carpetas cuando se ejecuta, por lo que si se ejecuta una vez, entonces la carpeta se elimina después de eso, es posible que no devuelva falso si se ejecuta nuevamente. – Jase

+2

también lo hace file_exists – Sebas

1
$save_folder = "some/path/" . date('dmy'); 

if (!file_exists($save_folder)) { 
    mkdir($save_folder, 0777); 
} 
+1

Establecer chmod 777 nunca es una buena idea. 755 es suficiente para las carpetas. – Oldskool

1

Bueno en vez de comprobar tanto, se podría hacer if(stream_resolve_include_path($folder)!==false). Es slower pero mata a dos pájaros de una vez.

Otra opción es simplemente ignorar el E_WARNING, no mediante el uso de @mkdir(...); (porque eso simplemente renunciar a todas las advertencias posibles, no sólo el directorio ya existe uno), sino por el registro de un gestor de errores específica antes de hacerlo:

namespace com\stackoverflow; 

set_error_handler(function($errno, $errm) { 
    if (strpos($errm,"exists") === false) throw new \Exception($errm); //or better: create your own FolderCreationException class 
}); 
mkdir($folder); 
/* possibly more mkdir instructions, which is when this becomes useful */ 
restore_error_handler(); 
4

segunda variante en cuestión post no es aceptable, ya que, si ya tiene el archivo con el mismo nombre, pero no es un directorio, !file_exists($dir) regresará false, no se creará la carpeta, así que el error "failed to open stream: No such file or directory" habrá ocurrió En Windows existe una diferencia entre 'archivo' y los tipos de carpetas '', por lo que tenga que utilizar file_exists()is_dir() y, al mismo tiempo, por ej .:

if (file_exists('file')) { 
    if (!is_dir('file')) { //if file is already present, but it's not a dir 
     //do something with file - delete, rename, etc. 
     unlink('file'); //for example 
     mkdir('file', NEEDED_ACCESS_LEVEL); 
    } 
} else { //no file exists with this name 
    mkdir('file', NEEDED_ACCESS_LEVEL); 
} 
0

añadir cierto después de 0777

<?php 
    $dirname = "small"; 
    $filename = "upload/".$dirname."/"; 

    if (!is_dir($filename)) { 
     mkdir("upload/" . $dirname, 0777, true); 
     echo "The directory $dirname was successfully created."; 
     exit; 
    } else { 
     echo "The directory $dirname exists."; 
    } 
    ?> 
Cuestiones relacionadas