【问题标题】:rename folder into sub-folder with PHP使用 PHP 将文件夹重命名为子文件夹
【发布时间】:2011-02-08 21:00:03
【问题描述】:

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

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

我得到的错误是:rename(...): No such file or directory

我认为这是因为目录“xxx1”不存在。 无论如何如何移动 test1 目录?

【问题讨论】:

    标签: php directory rename


    【解决方案1】:

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

    $toName = "test2/xxx1/xxx2";
    
    if (!is_dir(dirname($toName))) {
        mkdir(dirname($toName), 0777, true);
    }
    
    rename("test1", $toName);
    

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

    【讨论】:

    • 如果目录已经存在,重命名会不会失败? “xxx1”和“xxx2”都是目录,第二个参数也可以是“xxx2/”...
    • 如果目标 $toName 存在,它会失败,但你的原始代码不会有这个问题吗?
    【解决方案2】:

    为什么不通过创建它们来确保所有父目录都存在呢? mkdir - 使用递归参数。

    【讨论】:

      【解决方案3】:

      您的假设是正确的,这是因为您的示例中的“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 已经存在但它是一个文件(不是目录)怎么办?为什么我在mkdir时放了0777访问权限?如果 mkdir 失败了怎么办?

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-12
          • 2014-09-09
          • 2012-08-13
          • 2018-08-21
          相关资源
          最近更新 更多