在 php 中重命名多个文件而不用另一个文件覆盖

Rename multiple files without overwriting one with another in php

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

假设这些是我的文件名:

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

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

这些是 Ioana.php 被覆盖的示例。因为Maria.php"wanted"那个名字。

或者说这个例子:

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

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

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

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

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

在重命名文件之前使用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)]);
  }
}
?>

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

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

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

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.