【问题标题】:Rename multiple files without overwriting one with another in php在php中重命名多个文件而不用另一个文件覆盖
【发布时间】:2020-10-06 01:20:02
【问题描述】:

我在一个文件夹中有很多文件。我想重命名它们而不用另一个覆盖。

假设这些是我的文件名:

  • Ana.php
  • 玛丽亚.php
  • Ioana.php
  • Georgiana.php
  • 比安卡.php

我得到一个数组,告诉我要重命名哪些文件:

array(
    "Maria.php"  => "Ioana.php",
    "Bianca.php" => "Cristina.php",
    "Ioana.php"  => "Daniela.php"
)

这是Ioana.php 被覆盖的示例。因为Maria.php“想要”这个名字。

或者让我们说这个例子:

array(
    "Maria.php"  => "Ioana.php",
    "Ioana.php"  => "Maria.php"
)

这些是文件想要切换名称的示例。

我需要一个解决方案,无论应该重命名哪些文件,它们都不会覆盖文件夹中的另一个文件。每次应该重命名的文件数可能不同。

我需要重命名所有数组文件。问题是如何在不覆盖的情况下做到这一点。

文件的名称非常重要。添加时间戳后缀不是一个好的解决方案。

【问题讨论】:

  • 到目前为止你有没有为自己尝试过什么?
  • 我只知道 rename() 函数。但我不知道用什么解决方案来满足我的需要。

标签: php directory overriding rename filenames


【解决方案1】:

使用file_exists($filename) 在重命名文件之前检查他是否存在,例如:

<?php
while(count($arr) > 0)
{
  foreach ($arr as &$value) {
    if (file_exists($value)) {
      rename($value,$value + "temp");

    }
    rename(array_search($value,$arr),$value);
    unset($tab[array_search($value, $arr)]);
  }
}
?>

你只需要在你的数组上循环,直到所有文件都被重命名

【讨论】:

  • 谢谢回复。我需要重命名所有数组文件。问题是如何在不覆盖的情况下做到这一点。
  • 我编辑了我的代码,它不会覆盖你的文件,因为它会检查新名称是否已经被使用,你只需要添加一个条件来检查所有文件是否已被替换跨度>
  • 什么包含 $arr 和什么包含 $array ?使用 $value 的地址 (&) 有何帮助?
  • $arr 是您的“替换名称”数组,而 $value 是变量,它将获取数组的每个值和键。
  • 谢谢乔纳森。我添加了一个新示例以使问题更清楚。
【解决方案2】:

我创建了自己的多个文件夹文件名。

正如我在问题中解释和询问的那样(就在顶部),此功能可防止过度写入。

function rename (array $names): void {
    $dirname = '...';
    $files = File::folder($dirname); // 'File' is my own static class.

    foreach ($names as $key => $name) {
        $names[$key] = (basename($name) .'.'. File::extension($key));
        // 'File' is my own static class.
    }

    $duplicates = array(); // for avoiding overwriting
    foreach ($files as $key => $file) {
        $duplicates[$key] = tempnam(sys_get_temp_dir(), '');
        copy($file, $duplicates[$key]);
    }

    foreach ($names as $key => $name) {
        if (isset($files[$key])) { // for preventing non-existent input filename
            // remove file if its name isn't used for renaming
            if (is_file($files[$key]) && !in_array($key, $names)) {
                unlink($files[$key]);
            }
            rename($duplicates[$key], $dirname .'/'. $names[$key]);
        }
    }
}

rename(array(
    "Maria.php"  => "Ioana",
    "Bianca.php" => "Cristina",
    "Ioana.php"  => "Daniela"
)); // Your new names don't have their extension, because you can't change the extension.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 2021-10-25
    • 2023-03-10
    • 1970-01-01
    • 2015-05-10
    相关资源
    最近更新 更多