2010-03-14 203 views
1

我使用以下函數重命名縮略圖。
例如,如果我將名爲「image.png」的文件上載到上傳文件夾,並且該文件夾中已經有一個名爲「image.png」的文件,則新文件會自動更名爲「image-copy-1巴紐」。如果還有一個名爲「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; 
}?> 

回答

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在文件夾中的MAX文件):

$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

非常感謝您的回答(以及回答獎勵問題)! – snorpey 2010-03-15 09:57:09

0

當其重命名像1-copy-2-copy-1.png的文件是什麼,你要上傳的文件的名稱?

因爲:
如果文件有此名1-copy-2.png這是很正常的1-copy-2-copy-1.png爲重命名的文件...

否則就有問題:)

+0

我總是上傳一個名爲「1.png」的文件。 – snorpey 2010-03-14 23:02:13

0

它看起來像你的代碼只檢查名爲1-copy-1.png的文件副本是否存在?當它發現它重命名爲1-copy-2.png

然而,它不檢查文件1-copy-2.png是否存在並且不增加它。

但在您的解決方案中,腳本需要檢查文件夾中的每個文件。所以如果有很多文件。它會很慢。

相關問題