frename PHP 灵活文件命名函数 frename

对付这种情况,有的做法是用时间戳对新文件进行重新命名,有的是用序号递增的方法,为了解决麻烦的操作,我在最近编写了一个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}');
?>

(0)

相关推荐

  • php中mkdir函数用法实例分析

    本文实例分析了php中mkdir函数用法.分享给大家供大家参考.具体分析如下: mkdir()语法:bool mkdir(字符串目录,诠释权限)dirThe新directory.permissionsOctal数指定为新的directory.Creates一个新的目录的权限. mkdir()创建一个具有指定权限的目录,权限是,作为文件模式()和fileperms()相同的形式,在成功返回真,如果发生错误,则返回FALSE. php范例代码如下: 复制代码 代码如下: <?php if (mkdi

  • php中rename函数用法分析

    本文实例分析了php中rename()函数用法.分享给大家供大家参考.具体如下: php filesystem 函数,rename() 函数重命名文件或目录,若成功,则该函数返回 true.若失败,则返回 false. 语句:rename(oldname,newname,context) 参数 描述 oldname 必需,规定要重命名的文件或目录. newname 必需,规定文件或目录的新名称 context 必需,规定文件句柄的环境,context 是可修改流的行为的一套选项 注释:在 php

  • php中opendir函数用法实例

    本文实例分析了php中opendir函数用法.分享给大家供大家参考.具体如下: opendir语法:opendir(path,context) 目录,功能说明:打开目录句柄,opendir() 函数打开一个目录句柄,则该函数返回一个目录流,否则返回false.来看个opendir列出目录下所有文件实例,代码如下: 复制代码 代码如下: $dirs ='./';//指定当前上当 if( is_dir( $dirs ) ) {  $hanld = opendir($dirs);    while (

  • php Rename 更改文件、文件夹名称

    命令格式为: bool rename ( string oldname, string newname [, resource context] ) 下面演示rename的具体应用: 文件位置如图:目的:1.把cache.txt 更名为rename.txt; 2.将cache2.txt更名为cache3.txt 3.将html目录 更名为 cache 4.将file目录转移到html目录下(可以实现更名) 代码实现(有错误): 复制代码 代码如下: <?php $file = "html/

  • php的dl函数用法实例

    本文实例讲述了php的dl函数用法.分享给大家供大家参考.具体如下: PHP的dl函数官网说明如下: http://www.php.net/manual/en/function.dl.php 具体用法示例如下: 复制代码 代码如下: <?php // Example loading an extension based on OS if (!extension_loaded('sqlite')) {     if (strtoupper(substr(PHP_OS, 0, 3)) === 'WI

  • php中explode函数用法分析

    本文实例分析了php中explode函数用法.分享给大家供大家参考.具体如下: explode(string separator,string string [,int limit]) separator 为空字符串(""),explode() 将返回 FALSE,如果 separator 所包含的值在 string 中找不到,那么 explode() 将返回包含 string 单个元素的数组. explode实例一,代码如下: 复制代码 代码如下: $explode = "

  • php中strtotime函数用法详解

    本文实例讲述了php中strtotime函数用法.分享给大家供大家参考.具体如下: strtotime(字符串$时间[,诠释$现在])int strtotime(string $time [,int $now] 该函数期望得到一个包含美国英语日期格式,并会尝试解析成一个Unix时间戳(多少秒自1970年1月1日00:00:00星期一该格式),相对于现在提供的时间戳,或当前时间如果现在不提供 这个函数将使用TZ环境变量(如果有)来计算时间戳,自PHP 5.1.0有更容易的方法来确定所使用的所有/日

  • php中chdir()函数用法实例

    本文实例讲述了php中chdir()函数的用法.分享给大家供大家参考.具体用法分析如下: php chdir() 函数语法:bool切换目录(字符串目录)dirDirectory改变to.Changes当前工作目录. 语法:bool切换目录(字符串目录)dirDirectory改变to.Changes当前工作目录,在成功返回真,如果发生错误,则返回FALSE. 范例代码如下: 复制代码 代码如下: <?php if (chdir("upload")) {     print &q

  • PHP之sprintf函数用法详解

    本文实例讲述了PHP中sprintf函数的用法.分享给大家供大家参考.具体用法分析如下: sprintf()函数在php官方是说把字符串格式化输出了,本文就来给各位朋友介绍一下在学习sprintf()函数时的一些经验分享,希望能给大家带来帮助. PHP函数 sprintf() 函数官方定义为:sprintf():把格式化的字符串写入一个变量中 语法为:sprintf(format,arg1,arg2,arg++); 参数: format:必须,转换格式 arg1 :必须,规定插入 format

  • php中substr()函数参数说明及用法实例

    本文实例讲述了php中substr()函数参数说明及用法.分享给大家供大家参考.具体如下: string substr(string $string ,int $start [, int $length ]),它可以用于在一个较长的字符串中查找匹配的字符串或字符,$string为所要处理的字符串,$start为开始选取的位置,$length为要选取的长度. $length 为正数据从左向右读取字符. $length 为负数时就右向左读取字符. string 必需,规定要返回其中一部分的字符串.

  • php之readdir函数用法实例

    本文实例讲述了php中readdir函数用法.分享给大家供大家参考.具体用法分析如下: 定义和用法:readdir() 函数返回由 opendir() 打开的目录句柄中的条目,若成功,则该函数返回一个文件名,否则返回 false. 实例一,代码如下: 复制代码 代码如下: $dir = "readdir/";   // 判断是否为目录 if (is_dir($dir)) {     if ($dh = opendir($dir)) {         while (($file = r

随机推荐