Скопировать файл, переименовать его, если файл назначения уже существует.


Я хотел бы некоторую обратную связь на эту маленькую функцию полезности:

/**
 * Copy $src to $dest, renaming it if the desired destination already exists.  The
 * string '.versionX' is inserted before the file extension if a file must be
 * renamed, with X incremented as needed.
 *
 * @return boolean true if copy was successful, false otherwise.
 */
public static function copy_with_rename($src, $dest)
{
    if (file_exists($dest))
    {
        // See if it's the same.
        $existingFileHash = sha1_file($dest);
        $new_file_hash = sha1_file($src);
        if ($existingFileHash != $new_file_hash)
        {
            // File of same name exists, but is different.
            $last_dot_pos = strrpos($dest,'.');
            $file_count = 2;
            // So find a new name.
            do
            {
                $base_name = substr($dest, 0, $last_dot_pos);
                $ext = substr($dest, strlen($base_name)); // with dot
                $new_name = $base_name.'.version'.$file_count.$ext;
                $file_count++;
            } while (file_exists($new_name) && sha1_file($src)!=sha1_file($new_name));
            // And then try the copy again, with the new name.
            return file::copy_with_rename($src, $new_name);
        } else
        {
            return true;
        }
    } else
    {
        $dest_dir = dirname($dest);
        // Create (to any depth) the destination directory, if required.
        if (!file_exists($dest_dir))
        {
            mkdir($dest_dir, 0777, true);
        }
        // And finally do the actual copy.
        return copy($src, $dest);
    }
}


3200
4
php
задан 27 мая 2011 в 04:05 Источник Поделиться
Комментарии
1 ответ

Оригинальный Ответ:

Я бы поставил в дополнительные скобки в ваше время-петля для radability:

while ( file_exists($new_name) 
&& (sha1_file($src) != sha1_file($new_name))
);

И вы не должны установить файл-права доступа на 777 по умолчанию (660 или даже меньше). Все остальное выглядит вполне нормально в моих глазах (хотя я не люблю делать/пока строится, но я думаю, что это более личная вещь)

Обновление для комментария:

$srcSH1 = sha1_file($sec);
do
{
// ...
}
while ( file_exists($new_name)
&& (sha1_file($new_name) != $srcSH1)
);

Вы должны выйти на sha_file($ГКЗ) как это не меняется, а пересчитывается на каждой итерации. И это так, почему я не люблю делать/а. Разбивает $srcSH1 и при этом-состояние, при котором он используется.

3
ответ дан 29 мая 2011 в 10:05 Источник Поделиться