【问题标题】:rename files with the same name重命名具有相同名称的文件
【发布时间】:2011-01-27 11:56:55
【问题描述】:

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

【问题讨论】:

    标签: php regex file rename file-rename


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢您的回答(以及回答奖金问题)!
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      否则有问题:)

      【讨论】:

      • 我总是上传一个名为“1.png”的文件。
      猜你喜欢
      • 2022-06-14
      • 1970-01-01
      • 2021-10-24
      • 1970-01-01
      • 2022-07-06
      • 1970-01-01
      • 1970-01-01
      • 2016-01-04
      • 1970-01-01
      相关资源
      最近更新 更多