重命名具有相同名称的文件

时间:2010-03-14 22:43:48

标签: php regex file rename file-rename

我使用以下功能重命名缩略图 例如,如果我将名为“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-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;
}?>

3 个答案:

答案 0 :(得分: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 s。至于正则表达式:

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

所以,如果你计划有一个文件超过800个副本,正则表达式会更快(几微秒,但更快):)

答案 1 :(得分:0)

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

由于:
如果文件的名称为1-copy-2.png,则将1-copy-2-copy-1.png作为重命名的文件是正常的...

否则出现问题:)

答案 2 :(得分:0)

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

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

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