【发布时间】:2011-06-29 07:18:48
【问题描述】:
问题是在本地保存文件上传,并试图找到一种处理重复文件名的好方法。
【问题讨论】:
标签: php file duplicates filenames increment
问题是在本地保存文件上传,并试图找到一种处理重复文件名的好方法。
【问题讨论】:
标签: php file duplicates filenames increment
此算法不可扩展。上传 n 个同名文件会导致该算法的 O(n) 行为,导致 O(n²) 总运行时间,包括 O(n²) 次文件系统访问。这对于服务器应用程序来说并不好。由于文件系统的工作方式,它也无法修复。
更好的解决方案:
如有必要,使用数据库将文件名映射回人类可读的名称。
【讨论】:
最好的解决方案就是以 YYYYDDMMHHMMSS 的形式附加时间戳,你不会在你的整个生命中遇到冲突;) 它的时间复杂度也非常低。 您可以做的另一件事..您可以直接跳过名称检查,而是使用文件名 ex。 “1.jpg”如果您正在上传 只需附加 1(timestamp).jpg ,这样您甚至不需要遍历文件系统。希望对你有帮助
例如。在 PHP 中
$timestamp=date("YmdGis");
it will generate something like
20111122193631
;)
【讨论】:
我已经制定了自己的解决方案。这里是:
function recursive_increment_filename ($path, $filename)
{
$test = "{$path}/{$filename}";
if (!is_file($test)) return $test;
$file_info = pathinfo($filename);
$part_filename = $file_info['filename'];
if (preg_match ('/(.*)_(\d+)$/', $part_filename, $matches))
{
$num = (int)$matches[2] +1;
$part_filename = $matches[1];
}
else
{
$num = 1;
}
$filename = $part_filename.'_'.$num;
if (array_key_exists('extension', $file_info))
{
$filename .= '.'.$file_info['extension'];
}
return recursive_increment_filename($path, $filename);
}
$url = realpath(dirname(__FILE__));
$file = 'test.html';
$fn = recursive_increment_filename($url, $file);
echo $fn;
【讨论】: