用Guid为ASP.NET中的上传文件命名

文/kaima  出处/博客园

网上流行的多文件上传,都是上传之后,用日期时间命名。都认为方便、简单,似乎还能避免同目录下产生相同的文件。
代码大多如下:

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");

 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。
 您可能对 [Asp.Net] 的这些文章也感兴趣:

在ASP.NET中动态生成图形
Asp.net文件上传操作
asp.net域名查询
ASP.NET 3.5 Extensions新特性:ASP.NET Dynamic Data 体验(上)
.Net平台开发的技术规范与实践精华总结
检测含有中文字符串的实际长度
ASP.NET 3.5 Extensions CTP-ASP.NET MVC框架和Silverlight支持
C#中数据库操作
在ASP.NET页面中冻结DataGrid的列或头部
ASP.NET MVC Example with Northwind and Entity Framework