Ваше предположение было верным, потому что в вашем примере "xxx1" не существует.
Итак, перед rename("oldname", "/some/long/nested/path/test2/xxx1/newname")
необходимо создать древовидную структуру каталогов: /some/long/nested/path/test2/xxx1/
, но newname
файл (или каталог) не должен существовать в момент вызова функции rename
.
Для обобщения решения взгляните на следующую наивную функцию:
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");
Я назвал эту реализацию "наивной", потому что в реальном производстве вам также следует подумать о том, как справиться с некоторыми крайними случаями: что, если $ newname уже существует? Что если /some/long/nested/path/test2/xxx1
уже существует, но это файл (не каталог)? Почему я ставлю 0777 права доступа при mkdir? Что делать, если Mkdir не удалось?