使用PHP将文件夹重命名为子文件夹

15

我试图通过重命名来移动一个文件夹。 test1 和 test2 文件夹都已经存在。

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

我遇到的错误是:rename(...): 没有那个文件或目录

我认为这是因为目录"xxx1"不存在。 无论如何,我怎样才能移动test1目录呢?

4个回答

19

你可能需要创建它要进入的目录,例如:

$toName = "test2/xxx1/xxx2";

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

rename("test1", $toName);

mkdir()函数的第三个参数是“recursive”,这意味着您可以通过一次调用创建嵌套目录。


如果目录已经存在,重命名是否会失败呢? "xxx1"和"xxx2"都是目录,第二个参数也可以是"xxx2/"... - Workoholic
如果目标 $toName 已经存在,它将会失败,但是你的原始代码本来也会遇到这个问题,不是吗? - Tom Haigh

2
为什么不先确保所有父目录存在,然后再创建它们呢?可以使用mkdir函数,并使用递归参数。

2
你的假设是正确的,这是因为你的示例中的“xxx1”不存在。
因此,在使用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失败怎么办?


0

我认为test2/xxx1需要存在,所以在移动它之前您需要使用mkdir。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接