我使用以下功能重命名缩略图
例如,如果我将名为“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;
}?>
答案 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是否存在并且不会增加它。
但是在您的解决方案中,脚本需要检查文件夹中的每个文件。所以如果有很多文件。它会很慢。