frename PHP 灵活文件命名函数 frename
作者:bea
对付这种情况,有的做法是用时间戳对新文件进行重新命名,有的是用序号递增的方法,为了解决麻烦的操作,我在最近编写了一个frename函数,可以灵活依据自定义的规则取得上传文件的新命名,特此分享。 代码如下: <?php function frename($file, $rule='{timestamp}', $force = true) { /* ----------------------- * author: m35 * date: 2009/8/11 *
对付这种情况,有的做法是用时间戳对新文件进行重新命名,有的是用序号递增的方法,为了解决麻烦的操作,我在最近编写了一个frename函数,可以灵活依据自定义的规则取得上传文件的新命名,特此分享。
代码如下:
<?php
function frename($file, $rule='{timestamp}', $force = true) {
/* -----------------------
* author: m35
* date: 2009/8/11
* 依据命名规则取得文件的新命名,以处理上传文件等操作时遇到的文件名已存在的情况
* @parm1 $file -- 文件物理路径
* @parm2 $rule -- 命名规则, 默认为时间戳
* @parm3 $force -- 是否强制命名,如果是强制,就算该目标文件不存在也会对其进行命名,默认强制
* retrun str -- 依据$rule命名的新文件路径
* 示例:
echo '默认规则(时间戳):' . frename(__FILE__);
echo '<br />序号递增规则:' . frename(__FILE__, '{name}{n}');
echo '<br />n个前导0的序号递增规则:' . frename(__FILE__, '{name}{5n}');
echo '<br />用分隔符<span style="color: #E00;">_</span>并带有3个前导0的序号递增规则:' . frename(__FILE__, '{3n}<_>{name}');
echo '<br />使用时间日期元素组合的规则:' . frename(__FILE__, '{y}_{m}_{d}_{h}_{i}_{s}');
echo '<br />使用简写形式的时间日期元素组合的规则:' . frename(__FILE__, '{Y}_{M}_{D}_{H}_{i}_{s}');
echo '<br />其他自定义组合:' . frename(__FILE__, '{timestamp}_{name}<_>{n}');
----------------------- */
if (!$force && !file_exists($file)) return $file;
$filename = basename($file);
$path = str_replace($filename, '', $file);
$suffix = substr($filename, strrpos($filename, '.'));
$name = str_replace($suffix, '', $filename);
$timestamp = time();
list($y, $Y, $m, $M, $d, $D, $h, $H, $i, $s) = explode(',', date('Y,y,m,n,d,j,h,G,i,s'));
$tempname = str_replace(
array('{name}', '{timestamp}', '{y}', '{Y}', '{m}', '{M}', '{d}', '{D}', '{h}', '{H}', '{i}', '{s}'),
array($name, $timestamp, $y, $Y, $m, $M, $d, $D, $h, $H, $i, $s),
$rule
);
if (preg_match('/{(d?)n}/', $rule, $n)) {
preg_match('/<([^>]+)>/', $tempname, $sep);
$file = $path . str_replace(array($n[0], $sep[0]), array('', ''), $tempname) . $suffix;
if (!file_exists($file)) return $file;
$tempname = str_replace($sep[0], $sep[1], $tempname);
$tname = $tempname;
$i = 1;
do {
$nn = sprintf("%0{$n[1]}s", $i);
$tempname = str_replace($n[0], $nn, $tname);
$file = $path . $tempname . $suffix;
}
while (file_exists($file));
return $file;
} else {
$file = $path . $tempname . $suffix;
if (file_exists($file)) return false;
else return $path . $tempname . $suffix;
}
}
echo '默认规则(时间戳):' . frename(__FILE__);
echo '<br />序号递增规则:' . frename(__FILE__, '{name}{n}');
echo '<br />n个前导0的序号递增规则:' . frename(__FILE__, '{name}{5n}');
echo '<br />用分隔符<span style="color: #E00;">_</span>并带有3个前导0的序号递增规则:' . frename(__FILE__, '{3n}<_>{name}');
echo '<br />使用时间日期元素组合的规则:' . frename(__FILE__, '{y}_{m}_{d}_{h}_{i}_{s}');
echo '<br />使用简写形式的时间日期元素组合的规则:' . frename(__FILE__, '{Y}_{M}_{D}_{H}_{i}_{s}');
echo '<br />其他自定义组合:' . frename(__FILE__, '{timestamp}_{name}<_>{n}');
?>
有用 | 无用
代码如下:
<?php
function frename($file, $rule='{timestamp}', $force = true) {
/* -----------------------
* author: m35
* date: 2009/8/11
* 依据命名规则取得文件的新命名,以处理上传文件等操作时遇到的文件名已存在的情况
* @parm1 $file -- 文件物理路径
* @parm2 $rule -- 命名规则, 默认为时间戳
* @parm3 $force -- 是否强制命名,如果是强制,就算该目标文件不存在也会对其进行命名,默认强制
* retrun str -- 依据$rule命名的新文件路径
* 示例:
echo '默认规则(时间戳):' . frename(__FILE__);
echo '<br />序号递增规则:' . frename(__FILE__, '{name}{n}');
echo '<br />n个前导0的序号递增规则:' . frename(__FILE__, '{name}{5n}');
echo '<br />用分隔符<span style="color: #E00;">_</span>并带有3个前导0的序号递增规则:' . frename(__FILE__, '{3n}<_>{name}');
echo '<br />使用时间日期元素组合的规则:' . frename(__FILE__, '{y}_{m}_{d}_{h}_{i}_{s}');
echo '<br />使用简写形式的时间日期元素组合的规则:' . frename(__FILE__, '{Y}_{M}_{D}_{H}_{i}_{s}');
echo '<br />其他自定义组合:' . frename(__FILE__, '{timestamp}_{name}<_>{n}');
----------------------- */
if (!$force && !file_exists($file)) return $file;
$filename = basename($file);
$path = str_replace($filename, '', $file);
$suffix = substr($filename, strrpos($filename, '.'));
$name = str_replace($suffix, '', $filename);
$timestamp = time();
list($y, $Y, $m, $M, $d, $D, $h, $H, $i, $s) = explode(',', date('Y,y,m,n,d,j,h,G,i,s'));
$tempname = str_replace(
array('{name}', '{timestamp}', '{y}', '{Y}', '{m}', '{M}', '{d}', '{D}', '{h}', '{H}', '{i}', '{s}'),
array($name, $timestamp, $y, $Y, $m, $M, $d, $D, $h, $H, $i, $s),
$rule
);
if (preg_match('/{(d?)n}/', $rule, $n)) {
preg_match('/<([^>]+)>/', $tempname, $sep);
$file = $path . str_replace(array($n[0], $sep[0]), array('', ''), $tempname) . $suffix;
if (!file_exists($file)) return $file;
$tempname = str_replace($sep[0], $sep[1], $tempname);
$tname = $tempname;
$i = 1;
do {
$nn = sprintf("%0{$n[1]}s", $i);
$tempname = str_replace($n[0], $nn, $tname);
$file = $path . $tempname . $suffix;
}
while (file_exists($file));
return $file;
} else {
$file = $path . $tempname . $suffix;
if (file_exists($file)) return false;
else return $path . $tempname . $suffix;
}
}
echo '默认规则(时间戳):' . frename(__FILE__);
echo '<br />序号递增规则:' . frename(__FILE__, '{name}{n}');
echo '<br />n个前导0的序号递增规则:' . frename(__FILE__, '{name}{5n}');
echo '<br />用分隔符<span style="color: #E00;">_</span>并带有3个前导0的序号递增规则:' . frename(__FILE__, '{3n}<_>{name}');
echo '<br />使用时间日期元素组合的规则:' . frename(__FILE__, '{y}_{m}_{d}_{h}_{i}_{s}');
echo '<br />使用简写形式的时间日期元素组合的规则:' . frename(__FILE__, '{Y}_{M}_{D}_{H}_{i}_{s}');
echo '<br />其他自定义组合:' . frename(__FILE__, '{timestamp}_{name}<_>{n}');
?>
有用 | 无用
猜你喜欢
您可能感兴趣的文章:
- php面向对象全攻略 (四)构造方法与析构方法
- php面向对象全攻略 (三)特殊的引用“$this”的使用
- php面向对象全攻略 (二) 实例化对象 使用对象成员
- php面向对象全攻略 (一) 面向对象基础知识
- PHP5 操作MySQL数据库基础代码
- PHP 字符截取 解决中文的截取问题,不用mb系列
- php 生成饼图 三维饼图
- php 不同编码下的字符串长度区分
- php 应用程序安全防范技术研究
- 从Web查询数据库之PHP与MySQL篇
- php 服务器调试 Zend Debugger 的安装教程
- php 代码优化的42条建议 推荐
- PHP下通过系统信号量加锁方式获取递增序列ID
- PHP 日常开发小技巧
- php程序之die调试法 快速解决错误
- 火车采集器 免费版使出收费版本功能实现原理
- 使用php来实现网络服务
- Discuz 6.0+ 批量注册用户名
- PHP 分页类(模仿google)-面试题目解答