现在的位置: 首页 > 综合 > 正文

从根本上避免上传文件重名【asp.net】

2012年01月21日 ⁄ 综合 ⁄ 共 1156字 ⁄ 字号 评论关闭

        最近在做一个网站定时生成页面的功能,其中出现了一个问题是生成页文件名重名的问题。刚开始,我通过时间来命名,就是说什么时间生成,它的名字就是那一刻的时间,而且精确到了毫秒级,通常这样做已经足够了,不会出现差错,但是很不幸,我发现页面生成的效率要远比我想象的要高,我测试了一下,20个页面竟然可以在一毫秒内生成,这样就导致了后来的页面覆盖掉前面的,最后只剩下最后一个页面而已了。

        有一种解决办法就是判断重名,如果文件名已经存在,那么就换一个名字,但是,这样每次都要判断。更要紧的是,随着时间的推移,现有的页面必然越来越多,每次生成都要遍历一下目录,岂不是很麻烦?虽然可能有比较好的搜索算法来提高效率,但是我想还不如从根本上解决这个问题更好。

        这样就是产生了使用GUID的想法,GUID的全拼是globally unique identifier,即全球唯一标识符。GUID是微软使用的一个术语,通过特定的算法,给某一个实体创建一个唯一的标识,此标识符可以保证全球唯一。

          一个 GUID 共128位长(16字节),形如 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx。其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字,前4个字节为随机数;5-8字节为时间戳,记录了该GUID的生成时间(低16位字在前,以分钟为单位),保证了时间上的唯一;9-10字节与机器重启次数有关;最后6字节一般为该机器的网卡地址(如果这台机器没有网卡,则使用另一常数),从而保证了空间上的唯一。因此几乎不可能生成两个相同的GUID,从而保证了名字的唯一性。

        GUID 在 .NET 中的使用很广泛,同时.NET Framework 提供了专门 Guid 类,用户可以很容易的产生GUID。比如在asp.net中就可以想这样产生一个GUID:System.GUID.NewGUID()。基于这样的原理,我就可以使用这个类为我生成的文件命名了,从根本上解决了重名的问题。不仅如此,这个方法还可以应用到上传文件的命名上。        

        进一步了解,发现GUID使用很广泛,其实我们平时也经常看到。如注册表、类及接口标识、数据库、以及自动生成的机器名、目录名等。你可以打开你的系统盘下\WINDOWS\Installer目录,可以看到很多类似{0EFDF2F9-836D-4EB7-A32D-038BD3F1FB2A}的文件夹,这就是系统自动生成的目录名。注册表中也可以发现这样的数字串,以前也不知道是什么,现在明白了,都是系统为了避免重名生成的GUID。

更多详细参考:http://blog.mm-share.cn/post/139.html

猫猫的园地

抱歉!评论已关闭.