переименовать файлы с тем же именем - PullRequest
1 голос
/ 15 марта 2010

Я использую следующую функцию для переименования миниатюр.
Например, если я загружаю файл с именем «image.png» в папку загрузки и в этой папке уже есть файл с именем «image.png», новый файл автоматически переименовывается в «image-copy-1.png». ». Если также имеется файл с именем «image-copy-1.png», он переименовывается в «image-copy-2.png» и т. Д.
Следующая функция возвращает новое имя файла. По крайней мере, это то, что он должен делать ...
Переименование, похоже, не работает правильно. Иногда это приводит к странным результатам, например: (я всегда загружал файл с именем "1.png")
1-копия-1.png
1-копия-2.png
1-копия-2-копия-1.png
1-копия-2-копия-3.png

Надеюсь, вы понимаете мою проблему, несмотря на то, что мое описание несколько сложное ... Можете ли вы сказать мне, что здесь пошло не так? (Бонусный вопрос: правильные ли инструменты для выполнения подобных задач?)

<?php
function renameDuplicates($path, $file)
{   
    $fileName = pathinfo($path . $file, PATHINFO_FILENAME);
    $fileExtension = "." . pathinfo($path . $file, PATHINFO_EXTENSION);

    if(file_exists($path . $file))
    {
        $fileCopy = $fileName . "-copy-1";

        if(file_exists($path . $fileCopy . $fileExtension))
        {           
            if ($contains = preg_match_all ("/.*?(copy)(-)(\\d+)/is", $fileCopy, $matches))
            {
                $copyIndex = $matches[3][0];            
                $fileName = substr($fileCopy, 0, -(strlen("-copy-" . $copyIndex))) . "-copy-" . ($copyIndex + 1);
            }                       
        }

        else
        {
            $fileName .= "-copy-1";
        }
    }

    $returnValue = $fileName . $fileExtension;  
    return $returnValue;
}?>

Ответы [ 3 ]

2 голосов
/ 15 марта 2010

проще, без регулярных выражений;

function renameDuplicates($path, $file)
{   
    $fileName = pathinfo($path . $file, PATHINFO_FILENAME);
    $fileExtension = "." . pathinfo($path . $file, PATHINFO_EXTENSION);

    $returnValue = $fileName . $fileExtension;

    $copy = 1;
    while(file_exists($path . $returnValue))
    {
        $returnValue = $fileName . '-copy-'. $copy . $fileExtension;
        $copy++;
    }
    return $returnValue;
}

Быстрый бенчмарк для проблем с производительностью (32000 - это максимум файлов в папке):

$start = microtime(1);
$c=0;
while($c<32000)
    if(file_exists(__FILE__))
        $c++;
echo microtime(1) - $start; /* 0.44202709197998 */

Таким образом, для наихудшего сценария меньше половины секунды. А за 100 экземпляров - 0,0013940334320068 с. А что касается регулярного выражения:

$start = microtime(1);
$contains = preg_match_all ("/.*?(copy)(-)(\\d+)/is", __FILE__, $matches);
echo microtime(1) - $start; /* 0.010906934738159 */ 

поэтому, если вы планируете иметь более ~ 800 копий одного регулярного выражения файла, будет быстрее (на несколько микросекунд, но быстрее):)

0 голосов
/ 15 марта 2010

Похоже, ваш код только проверяет, существует ли копия файла с именем 1-copy-1.png? И когда он находит его, он переименовывает его в 1-copy-2.png

Однако он не проверяет, существует ли файл 1-copy-2.png, и не увеличивает его.

Но в вашем решении скрипт должен проверять каждый файл в папке. Так что, если есть много файлов. Это будет медленно.

0 голосов
/ 15 марта 2010

когда он переименовывает файл как 1-copy-2-copy-1.png как называется загружаемый файл?

Потому что:
если файл имеет имя 1-copy-2.png, обычно 1-copy-2-copy-1.png имеет переименованный файл ...

в противном случае возникает проблема:)

...