1

我使用以下函数重命名缩略图。
例如,如果我将名为“image.png”的文件上传到上传文件夹,并且该文件夹中已经有一个名为“image.png”的文件,则新文件会自动重命名为“image-copy-1.png” ”。如果还有一个名为“image-copy-1.png”的文件,它将被重命名为“image-copy-2.png”等等。
以下函数返回新文件名。至少这就是它应该做
的......不过,重命名似乎无法正常工作。有时它会产生奇怪的结果,例如:(我总是上传一个名为“1.png”的文件)
1-copy-1.png
1-copy-2.png
1-copy-2-copy-1.png
1-copy- 2-copy-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;
}?>
4

3 回答 3

2

更简单,没有正则表达式;

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 多个副本,正则表达式会更快(几微秒,但更快):)

于 2010-03-14T23:07:19.330 回答
0

当它重命名文件时,1-copy-2-copy-1.png您要上传的文件的名称是什么?

因为:
如果文件具有此名称1-copy-2.png,则通常将其1-copy-2-copy-1.png作为重命名文件...

否则有问题:)

于 2010-03-14T22:51:13.433 回答
0

看起来您的代码只检查是否存在名为 1-copy-1.png 的文件副本?当它找到它时,它会将其重命名为 1-copy-2.png

但是,它不会检查文件 1-copy-2.png 是否存在并且不会增加该文件。

但是在您的解决方案中,脚本需要检查文件夹中的每个文件。所以如果有很多文件。它会很慢。

于 2010-03-14T23:08:17.847 回答