请选择 进入手机版 | 继续访问电脑版
收藏本站腾讯微博新浪微博
点点网模板设计大赛 phpchina

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 用悬赏 三天解决问题 解决访问速度慢 论坛支持农历生日 - 给官方提建议

论坛活动及任务 归纳网站最新活动 地图任务 邮件更新任务:保护帐号安全

积分换实物,来参加蓝色理想积分兑换吧! 联系招聘客服 蓝色理想帮你找工作! 万元奖励等你拿——点点网模板设计大赛

查看: 2777|回复: 20

[php] 问一个PHP重命名文件的算法 [复制链接]

tangl198710 楼主

啸天皇帝

银牌会员

帖子
587
体力
2290
威望
0
居住地
广东省 深圳市
发表于 2009-8-5 18:08:37 |显示全部楼层
在系统中 在新建文件是可以实现自动编号。比如新建文本文件 默认文件名是:新建 文本文档.txt,如果继续新建时文件名自动变了:新建 文本文档 (2).txt          以后就是   3,4,5....

请问这种算法用PHP怎么实现。

谢谢高手解答。
西部数码顶级域名注册商39元抢注!
Enoch 

雨弓

钻石会员 手机认证 

帖子
540
体力
5090
威望
2
发表于 2009-8-5 18:31:30 |显示全部楼层
if(file_exists())....
租服务器,上51IDC | [长沙]招聘:PHP经理10K/WEB前端6K/PHP开发6K

使用道具 举报

CentOS 

七夜

中级会员 手机认证 

帖子
557
体力
344
威望
2
发表于 2009-8-5 20:15:15 |显示全部楼层
static
看...灰机,灰过去了....没灰回来....掉了.

使用道具 举报

tangl198710 楼主

啸天皇帝

银牌会员

帖子
587
体力
2290
威望
0
居住地
广东省 深圳市
发表于 2009-8-6 07:22:05 |显示全部楼层
有没有高手帮忙给个完整的实例

使用道具 举报

罗亮

超级版主 手机认证 

帖子
15893
体力
19481
威望
19
居住地
北京市 海淀区
发表于 2009-8-6 10:02:37 |显示全部楼层
随便写了一个.

  1. <?php
  2. function createFile($filename, $content = '')
  3. {
  4.     $fp = file_put_contents($filename, $content);
  5. }

  6. // 要创建的文件名称
  7. $filename = 'wwww.rar';

  8. if(file_exists($filename))
  9. {
  10.     // 打开当前目录
  11.     $handle = opendir('./');
  12.     $fileinfo = pathinfo($filename);
  13.     //print_r($fileinfo);
  14.     $files = array();
  15.     while (false !== ($file = readdir($handle)))
  16.     {
  17.         if(preg_match_all("/{$fileinfo['filename']}(\d*)\.{$fileinfo['extension']}/i", $file, $match))
  18.         {
  19.             $max = max($match[1]);
  20.             if($max)
  21.             {
  22.                 $createfile = $fileinfo['filename'] . ($max + 1) . '.' . $fileinfo['extension'];
  23.             }
  24.             else
  25.             {
  26.                 $createfile = $fileinfo['filename'] . 1 . '.' . $fileinfo['extension'];
  27.             }
  28.         }
  29.     }
  30.    createFile($createfile);
  31. }
  32. else
  33. {
  34.     createFile($filename);
  35. }
  36. ?>
复制代码

[ 本帖最后由 wuleying 于 2009-8-6 10:06 编辑 ]

使用道具 举报

剑气

超级版主 手机认证 

帖子
7305
体力
18875
威望
178
居住地
湖北省 黄冈市
发表于 2009-8-6 10:06:40 |显示全部楼层
rename递加就行了
@ Blog @ 微博
我即使被关在果壳之中,仍然自以为无限空间之王。

使用道具 举报

臭蛋

荣誉管理 手机认证 

帖子
9363
体力
31966
威望
27
发表于 2009-8-6 11:30:17 |显示全部楼层
<?php
        $count = 0;
        foreach (glob("a*.txt") as $filename) {
                echo "$filename size " . filesize($filename) . "<br />";
                $count++;
        }
        file_put_contents('a'.($count==0?'':$count).'.txt','aaaaaaaaaa');
  ?>

使用道具 举报

罗亮

超级版主 手机认证 

帖子
15893
体力
19481
威望
19
居住地
北京市 海淀区
发表于 2009-8-6 11:52:59 |显示全部楼层

回复 7# 幻想曲 的帖子

此代码不能区分 a.txt 与 aa.txt

使用道具 举报

剑气

超级版主 手机认证 

帖子
7305
体力
18875
威望
178
居住地
湖北省 黄冈市
发表于 2009-8-6 12:11:58 |显示全部楼层
  1. $dir="/web/csp/images/default";
  2. $files=scandir($dir);
  3. $i=0;
  4. foreach ($files as $file){
  5.         $filename= basename($file);
  6.         $filename = substr("$filename", 0, strrpos("$filename", "."));
  7.         $extend = end(explode(".",$file));   
  8.         $i++;       
  9.         rename($file, $dir.'/'.$filename.'('.$i.').'.$extend);
  10. }
复制代码

读目录下所有文件,循环,得到文件名和后缀名,递增,改名
如果要得到一个目录下包括子目录的,改动也不是很大,LZ自己搞定吧
汗,我还以为是改名了

原理是先读目录,找有没有新建文本文档的,没有就新建,有的就看后面的是啥,(1)过滤掉()后,再加++就行了

[ 本帖最后由 剑气凌人 于 2009-8-6 12:32 编辑 ]
@ Blog @ 微博
我即使被关在果壳之中,仍然自以为无限空间之王。

使用道具 举报

剑气

超级版主 手机认证 

帖子
7305
体力
18875
威望
178
居住地
湖北省 黄冈市
发表于 2009-8-6 12:57:49 |显示全部楼层
想了一下,循环太占资源,用这种方法吧
  1. //新建
  2. $dir="/web/csp/images/test/";
  3. if(!file_exists($dir.'cache.txt')){
  4.         file_put_contents($dir.'cache.txt',1);
  5.         file_put_contents($dir.'新建文件.txt','');
  6. }else{
  7.         $num = file_get_contents($dir.'cache.txt');
  8.         $num ++ ;
  9.         $name = '新建文件 ('.$num.').txt';
  10.         file_put_contents($dir.'cache.txt',$num);
  11.         file_put_contents($dir.$name,'');
  12. }
复制代码
已有 1 人评分威望 收起 理由
wuleying + 1 不错不错..

总评分: 威望 + 1   查看全部评分

@ Blog @ 微博
我即使被关在果壳之中,仍然自以为无限空间之王。

使用道具 举报

罗亮

超级版主 手机认证 

帖子
15893
体力
19481
威望
19
居住地
北京市 海淀区
发表于 2009-8-6 13:15:25 |显示全部楼层
根据剑气的思路重写

  1. <?php
  2. function createFile($filename, $content = '')
  3. {
  4.     if(file_exists($filename . '.tmp'))
  5.     {
  6.         $num = (int) file_get_contents($filename . '.tmp') + 1;
  7.         $fileinfo = pathinfo($filename);
  8.         file_put_contents($fileinfo['filename'] . '(' . $num . ')' .$fileinfo['extension'], $content);
  9.         file_put_contents($filename . '.tmp', $num);
  10.     }
  11.     else
  12.     {
  13.         file_put_contents($filename, $content);
  14.         file_put_contents($filename . '.tmp', 1);
  15.     }
  16. }

  17. createFile('test.txt');
  18. ?>
复制代码

使用道具 举报

臭蛋

荣誉管理 手机认证 

帖子
9363
体力
31966
威望
27
发表于 2009-8-6 13:22:51 |显示全部楼层
如果.tmp/cache.txt被意外删除,就没招了。。。

使用道具 举报

罗亮

超级版主 手机认证 

帖子
15893
体力
19481
威望
19
居住地
北京市 海淀区
发表于 2009-8-6 13:24:00 |显示全部楼层

回复 12# 幻想曲 的帖子

chmod

使用道具 举报

剑气

超级版主 手机认证 

帖子
7305
体力
18875
威望
178
居住地
湖北省 黄冈市
发表于 2009-8-6 13:24:57 |显示全部楼层
思路,这个TME可以是数据库,可以文件,可以是配置文件,看你怎么做了,循环只是在维护的时候使用的,如果每建一个新文件也得循环一次,那得累死,缓存无处不在
写程序要有发散思维好吗?

[ 本帖最后由 剑气凌人 于 2009-8-6 13:28 编辑 ]
@ Blog @ 微博
我即使被关在果壳之中,仍然自以为无限空间之王。

使用道具 举报

tangl198710 楼主

啸天皇帝

银牌会员

帖子
587
体力
2290
威望
0
居住地
广东省 深圳市
发表于 2009-8-6 13:39:10 |显示全部楼层
各位都是高手  都能实现这个效果,但是感觉用缓存或数据库都不怎么好实现

首先如果是实现系统这个功能倒是可以,不过用在文件上传的时候缓存或数据库感觉就没那方便了。

使用道具 举报

剑气

超级版主 手机认证 

帖子
7305
体力
18875
威望
178
居住地
湖北省 黄冈市
发表于 2009-8-6 13:42:53 |显示全部楼层
上传时用MD5(time())来命名,和这没关系
@ Blog @ 微博
我即使被关在果壳之中,仍然自以为无限空间之王。

使用道具 举报

tangl198710 楼主

啸天皇帝

银牌会员

帖子
587
体力
2290
威望
0
居住地
广东省 深圳市
发表于 2009-8-6 13:55:22 |显示全部楼层
我在 FCKeditor里面看到的这个功能,它就是保留了上传文件的名字,如果名字有重复就自动加上了序号,所以就来问一下是怎么实现的。

我一般也是用 time() 来命名的上传文件。

问这个问题纯粹是为了研究技术而已.

使用道具 举报

kyan 

可言

中级会员

帖子
189
体力
1042
威望
0
居住地
广东省 珠海市
发表于 2009-8-6 17:26:24 |显示全部楼层
用while循环去判断新建文件($i).txt 是否存在,不存在的话返回文件名。
会有效率问题。
快乐带给你

使用道具 举报

六如居士

银牌会员

帖子
1543
体力
1904
威望
18
居住地
浙江省 杭州市
发表于 2009-8-6 20:25:46 |显示全部楼层
。。。干嘛不用scandir()呢。。。

<?php

$files = scandir('.');    //此代码在web根目录下写就
$num = 0;
$str = '新建 文本文档';
foreach ($files as $k=> $file) {
    if (is_file($file) && preg_match('/(.*)\((\d+)\)\.txt/', $file, $matched)) {
        $num = $matched[2]>$num ? $matched[2] : $num;
    }
}
$filename = $num == 0 ? $str . '(1).txt' : $str . '(' . ($num+1) . ').txt';
if (fopen($filename, 'w')) {
    echo '成功创建文件:' . $filename;
}

?>

如果用文件缓存最大数字,那如果把当前已有的最大文件删除掉后,新建的文件不会重新再新建这个文件,而是直接新建缓存中的那个最大数+1的文件去了。

[ 本帖最后由 112183883 于 2009-8-6 20:28 编辑 ]

使用道具 举报

tangl198710 楼主

啸天皇帝

银牌会员

帖子
587
体力
2290
威望
0
居住地
广东省 深圳市
发表于 2009-8-7 08:55:35 |显示全部楼层
看了一下  FCKeditor 的代码,根据它思路自己写了一个

<?php
$file = dirname(__FILE__).'/新建 文本文档.txt';

echo L_rename($file);

function L_rename($file){
        $iCount = 0;
        $File_type = strrchr($file, '.');
        $FilePath = substr($file, 0, strrpos($file, '.'));

        while (true) {
                if (is_file($file)) {
                        ++$iCount;
                        $file = $FilePath . '('. $iCount .')' . $File_type;
                }else{
                        break;
                }
        }

        if (fopen($file, 'w')) {$Msg = '创建成功 &nbsp; '.$file;}
        return $Msg;
}
?>

自我感觉不错,所以拿出来大家看看。

这个就跟系统中的一样了,上面[六如居士]说如果把最大文件删除了他的可以接着最大的来创建,但如果把中间某个删除了呢?

这个可以把中间删除的也补上。

呵呵.....

使用道具 举报

六如居士

银牌会员

帖子
1543
体力
1904
威望
18
居住地
浙江省 杭州市
发表于 2009-8-7 09:31:17 |显示全部楼层
我记忆中windows好像不会自动补中间被删的如"新建 文本文档(2).txt"这样的文件的,不过刚才试了下, 确实是会补的, 这个我在写的时候倒是没去验证, 呵呵. 这个都好办,弄一个当前文件号的队列,然后每次创建时检查队列,自动创建当中间隔大于1的那个文件就OK了.

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

Archiver|手机版|安久科技提供CDN|blueidea.com ( 京ICP备05002321号 )  

GMT+8, 2012-2-11 21:17 , Processed in 0.109662 second(s), 9 queries , Gzip On, Memcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部