我试图通过重命名来移动一个文件夹。 test1 和 test2 文件夹都已经存在。
rename(
"test1",
"test2/xxx1/xxx2"
);
我遇到的错误是:rename(...): 没有那个文件或目录
我认为这是因为目录"xxx1"不存在。 无论如何,我怎样才能移动test1目录呢?
你可能需要创建它要进入的目录,例如:
$toName = "test2/xxx1/xxx2";
if (!is_dir(dirname($toName))) {
mkdir(dirname($toName), 0777, true);
}
rename("test1", $toName);
mkdir()
函数的第三个参数是“recursive”,这意味着您可以通过一次调用创建嵌套目录。
rename("oldname", "/some/long/nested/path/test2/xxx1/newname")
之前,您必须创建目录树结构:/some/long/nested/path/test2/xxx1/
,但新文件(或目录)在调用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");
我把这个实现命名为“naive”,因为在真正的生产环境中,您还应该考虑处理一些边缘情况:如果$newname已经存在怎么办?如果/some/long/nested/path/test2/xxx1
已经存在但它是一个文件(而不是目录)怎么办?为什么在mkdir时我设置了0777访问权限?如果mkdir失败怎么办?
我认为test2/xxx1需要存在,所以在移动它之前您需要使用mkdir。
$toName
已经存在,它将会失败,但是你的原始代码本来也会遇到这个问题,不是吗? - Tom Haigh