Переименовать несколько файлов, не перезаписывая один другим в php - PullRequest
1 голос
/ 16 июня 2020

У меня в папке много файлов. И я хочу переименовать их, не перезаписывая один другим.

Допустим, это мои имена файлов:

  • Ана. php
  • Мария. php
  • Иоана. php
  • Джорджиана. 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"
)

Это пример, когда файлы хотят изменить свое имя.

Мне нужно решение, в котором независимо от того, какие файлы следует переименовывать, они никогда не перезаписывают другой файл из папки. Количество файлов, которые следует переименовать, может каждый раз быть разным.

Мне нужно переименовать все файлы массива. Проблема в том, как это сделать без перезаписи.

Имя файлов очень важно. Добавление суффикса отметки времени - не лучшее решение.

Ответы [ 2 ]

0 голосов
/ 25 июня 2020

Я создал свое собственное переименование файлов нескольких папок.

Эта функция предотвращает переопределение, как я объяснил и задал в вопросе (только вверху).

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.
0 голосов
/ 16 июня 2020

Используйте 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)]);
  }
}
?>

Вам просто нужно l oop в вашем массиве, пока все файлы не будут переименованы

...