1

次の関数を使用して、サムネイルの名前を変更します。
たとえば、「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;
}?>
4

3 に答える 3

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 */

したがって、最悪のシナリオでは 0.5 秒未満です。100 コピーの場合 - 0.0013940334320068 秒。そして正規表現に関しては:

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

したがって、1つのファイルの正規表現のコピーを最大800個以上作成する場合は、より高速になります(数マイクロ秒ですが、より高速になります):)

于 2010-03-14T23:07:19.330 に答える
0

あなたのコードは、1-copy-1.png という名前のファイル コピーが存在するかどうかのみをチェックしているように見えますか? そして、それが見つかると、名前を 1-copy-2.png に変更します

ただし、ファイル 1-copy-2.png が存在するかどうかはチェックせず、インクリメントもしません。

ただし、ソリューションでは、スクリプトはフォルダー内のすべてのファイルをチェックする必要があります。したがって、ファイルが多い場合。遅くなります。

于 2010-03-14T23:08:17.847 に答える
0

アップロードしているファイル1-copy-2-copy-1.pngの名前は何ですか?

理由:
ファイルにこの名前が付いている場合、名前が変更されたファイルとして1-copy-2.png存在するのが普通1-copy-2-copy-1.pngです...

そうでなければ問題があります:)

于 2010-03-14T22:51:13.433 に答える