我正在尝试通过重命名来移动文件夹。 test1和test2文件夹都已存在。
rename(
"test1",
"test2/xxx1/xxx2"
);
我得到的错误是:重命名(...):没有这样的文件或目录
我认为这是因为目录“xxx1”不存在。 我怎样才能移动test1目录?
答案 0 :(得分:15)
您可能需要创建它要进入的目录,例如
$toName = "test2/xxx1/xxx2";
if (!is_dir(dirname($toName))) {
mkdir(dirname($toName), 0777, true);
}
rename("test1", $toName);
mkdir()
的第三个参数是'recursive',这意味着您可以通过一次调用创建嵌套目录。
答案 1 :(得分:2)
为什么不通过制作它们来确保所有父目录首先存在? mkdir - 使用递归参数。
答案 2 :(得分:1)
你的假设是正确的,这是因为" xxx1"在你的例子中不存在。
因此,在rename("oldname", "/some/long/nested/path/test2/xxx1/newname")
之前,您必须创建目录树结构:/some/long/nested/path/test2/xxx1/
但newname
文件(或目录)必须不存在 { {1}}函数调用。
要概括解决方案,请查看以下天真函数:
rename
我将此实施命名为#34;天真"因为在实际制作中你还应该考虑处理一些边缘情况:如果$ newname已经存在怎么办?如果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");
已经存在但它是一个文件(不是目录)怎么办?为什么我在mkdir时放入0777访问权限?如果mkdir失败怎么办?
答案 3 :(得分:0)
我认为test2 / xxx1需要存在,所以在移动之前你需要使用mkdir。