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ó?
¿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
, fallará si el destino '$ toName' existe, pero ¿no habría tenido ese problema con su código original de todos modos? –