ASP.NET中上传多文件时,用日期时间命名新文件,这不是个好主意。

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

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

posted @ 2008-05-14 10:20  Kai.Ma  阅读(3861)  评论(23编辑  收藏  举报