aynı adı taşıyan dosyaları yeniden adlandırmak

3 Cevap php


I use the following function to rename thumbnails.
For example, if I upload a file called "image.png" to an upload folder, and this folder already has a file named "image.png" in it, the new file automatically gets renamed to "image-copy-1.png". If there also is a file called "image-copy-1.png" it gets renamed to "image-copy-2.png" and so on.
The following function returns the new filename. At least that's what it is supposed to do...
The renaming doesn't seeem to work correctly, though. Sometimes it produces strange results, like: (I always uploaded a file named "1.png")
1-copy-1.png
1-copy-2.png
1-copy-2-copy-1.png
1-copy-2-copy-3.png

Benim açıklama biraz karmaşık olmasına rağmen ... ne yanlış gitti bana söyleyebilir misiniz, benim sorunu anlamak umut? (Bonus soru: bu tarz şeyleri yapmak için doğru aracı düzenli ifadeler mi?)

<?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 Cevap

Regex olmadan, basit;

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;
}

Performans sorunları (32000 klasöründe max dosyaları) için Hızlı kriter:

$start = microtime(1);
$c=0;
while($c<32000)
    if(file_exists(__FILE__))
        $c++;
echo microtime(1) - $start; /* 0.44202709197998 */

Böylece daha az ikinci en kötü durum senaryosu için yarıdan. Ve 100 kopya için - ,0013940334320068 s. Ve regex için olduğu gibi:

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

Eğer bir dosya regex fazla ~ 800 kopya var planlıyorsanız eğer öyleyse (bazı mikrosaniye, ancak daha hızlı) daha hızlı olacak :)

Bu gibi dosyayı yeniden adlandırmak zaman 1-copy-2-copy-1.png Eğer karşıya dosyanın adı nedir?

Because:
if the file has this name 1-copy-2.png it's normal to have 1-copy-2-copy-1.png as a renamed file...

aksi halde bir sorun var :)

1-copy-1.png adında bir dosya kopyalama varsa kod sadece denetler gibi görünüyor? Bulduğu zaman o 1-Copy-2.png için adlandırır

Bir dosya 1-kopyalama-2.png var ve bu artırmaz Ancak eğer kontrol etmez.

Ama çözüm olarak komut klasörde her dosya kontrol etmek gerekir. O kadar çok dosya varsa. Bu yavaş olacaktır.