网上流行的多文件上传,都是上传之后,用日期时间命名。都认为方便、简单,似乎还能避免同目录下产生相同的文件。
代码大多如下:
string 新文件名 = DateTime.Now.ToString("yyMMddHHmmss");
上面这行代码会导致很有趣的bug:那就是当网站繁忙很多人同时上传的时候,或者一个人多文件同时上传的时候,你会发现,你传上去文件,经常性(跟别人)都是一样的,经常性“丢掉”一些图片。
你会奇怪,为什么?
很简单,服务器处理太快了,几乎1秒内就处理你的多文件上传请求,这一秒内,所有的文件名都相同(因为上面那个行代码就只精确到秒)。
OK,既然是文件名相同,我精确到毫秒,不就解决了?于是有了下面的代码:
string 新文件名 = DateTime.Now.ToString("yyMMddHHmmssfff");//精确到毫秒,防止1秒内被处理的文件获得的新名称都相同
经过上面的改造,会发现问题减少了很多,不再经常“丢”图片了……但是,偶尔还是有照片丢失的情况发生……知道原因吗?MSDN告诉我们:“Windows系统时钟精确到10~15毫秒”,也即说,DateTime类型只能精确到10~15毫秒。如果用时间命名,即便精确到毫秒,10~15毫秒内处理的文件,名字仍然会相同,有趣的bug仍然会产生。
故,不推荐使用日期时间命名文件。
那怎么办呢?用Guid!唯一的、一出生即与众不同的家伙,它的唯一性,理论上保证了同一目录下无可能出现重复的文件名。
string 新文件名 = Guid.NewGuid().ToString("N");
本文转自Kai的世界,道法自然博客园博客,原文链接:http://www.cnblogs.com/kaima/archive/2008/05/14/1196283.html,如需转载请自行联系原作者。