重命名已存在的文件

时间:2014-05-04 18:16:57

标签: php

目前我正在开发媒体上传系统。 当用户上传文件时,我希望系统自动检查该文件是否已经存在,如果是,则将(x)添加到基本名称。

DSC_2193.jpg将成为DSC_2193 (1).jpg

DSC_2193 (2).jpg将成为DSC_2193 (3).jpg

所以我想出了以下功能:

<?php
private function setFileName($path)
{
    if (file_exists($path)) {
        $file = pathinfo($path);
        if (preg_match('/\(([0-9]+)\).' . $file['extension'] . '/', $file['basename'], $matches)) {
            return $this->setFileName($file['dirname'] . '/' . preg_replace_callback('/\(([0-9]+)\).' . $file['extension'] . '/', function($matches)
            {
                return '(' . ($matches[1] + 1) . ')';
            }, $file['basename']) . '.' . $file['extension']);
        } else {
            $basename = substr(basename($path, $file['extension']), 0, -1);
            $basename .= ' (1).' . $file['extension'];
            return $this->setFileName($file['dirname'] . '/' . $basename);
        }
    }

    else
        return $path;
}
?>

现在我想知道:这是否是实现这一目标的正确方法?如果不是:也许有人可以提出更好的选择。如果这是最有效的方式,也许有人可以从中受益。

1 个答案:

答案 0 :(得分:0)

您可以使用while周期轻松完成。这是简单的划痕:

private function setFileName($path)
{
    $file = pathinfo($path);

    if (file_exists($path)) {
        $i = 1;
        while (file_exists($file['filename'] . ' (' . $i . ').' . $file['extension'])) $i++;

        $filename = $file['filename'] . ' (' . $i . ').' . $file['extension']; // don't know if you want also directory path
    }
    else
        $filename = $file['filename'] . '.' . $file['extension'];

    // some code to rename/move_uploaded_file...       
}

如果你设置了$filenamemove_uploaded_file,或只是return $filename),我不知道你想要什么,所以剩下的代码由你决定。