2010-04-16 11 views
9

Estoy tratando de mover una carpeta al renombrarla. Tanto las carpetas test1 como test2 ya existen.cambiar el nombre de la carpeta a la subcarpeta con PHP

rename(
"test1", 
"test2/xxx1/xxx2" 
); 

El error que consigo es: de cambio de nombre (...): No existe el fichero o directorio

Asumo que esto es debido a que el directorio "xxx1" no existe. ¿Cómo puedo mover el directorio test1 de todos modos?

Respuesta

1

¿Por qué no asegurarse de que todos los directorios principales existen primero, al hacerlos? mkdir - usa el parámetro recursivo.

12

Es posible que necesite crear el directorio al que va, p.

$toName = "test2/xxx1/xxx2"; 

if (!is_dir(dirname($toName))) { 
    mkdir(dirname($toName), 0777, true); 
} 

rename("test1", $toName); 

El tercer parámetro es a mkdir() 'recursivo', que significa que puede crear directorios anidados con una llamada.

+0

¿No cambiará el nombre si el directorio ya existe? Tanto "xxx1" como "xxx2" son directorios, y el segundo parámetro podría ser "xxx2 /" ... – Workoholic

+0

, fallará si el destino '$ toName' existe, pero ¿no habría tenido ese problema con su código original de todos modos? –

0

Creo que test2/xxx1 debería existir, por lo que necesitaría usar mkdir antes de moverlo.

0

Su suposición era correcta, esto es porque "xxx1" en su ejemplo no existe.

lo tanto, antes rename("oldname", "/some/long/nested/path/test2/xxx1/newname") usted tiene que crear la estructura de directorios del árbol: /some/long/nested/path/test2/xxx1/ pero newname archivo (o directorio) no debe existir en el momento de rename llamada a la función.

generalizar el aspecto solución a la siguiente función ingenua:

function renameWithNestedMkdir($oldname , $newname) 
{ 
    $targetDir = dirname($newname); // Returns a parent directory's path (operates naively on the input string, and is not aware of the actual filesystem) 

    // here $targetDir is "/some/long/nested/path/test2/xxx1" 
    if (!file_exists($targetDir)) { 
     mkdir($targetDir, 0777, true); // third parameter "true" allows the creation of nested directories 
    } 

    return rename($oldname , $newname); 
} 

// example call 
renameWithNestedMkdir("oldname", "/some/long/nested/path/test2/xxx1/newname"); 

// another example call 
renameWithNestedMkdir("test1", "test2/xxx1/xxx2"); 

puse el nombre de esta aplicación "ingenua" porque en la producción de bienes que también debe pensar en el manejo de algunos casos extremos: ¿y si $ newname ya existe? ¿Qué pasa si ya existe pero es un archivo (no un directorio)? ¿Por qué puse 0777 derechos de acceso mientras mkdir? ¿Qué pasa si mkdir falló?

Cuestiones relacionadas