asp.net上传文件重命名的方法及IO修改文件名

来源:互联网 发布:美国世界警察知乎 编辑:程序博客网 时间:2024/05/18 17:26
文件上传时为了避免覆盖掉文件名相同的文件,一般都是采用系统时间当文件名,精确到毫秒,这样可以防止上传文件冲突 

Java代码  收藏代码
  1. string name = this.FileUpload1.FileName;   
  2. string type = name.Substring(name.LastIndexOf(".") + 1);   
  3. //获取上传文件的后缀   
  4.   
  5. if (name != "")   
  6. {   
  7. string newName = DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString() + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString() + DateTime.Now.Millisecond.ToString() + "." + type;   
  8. //更改上传文件名   
  9.   
  10. string path = Server.MapPath("upfiles") + "\\" + newName;   
  11. FileUpload1.SaveAs(path);   
  12. }  
 
 
以上示例精确到毫秒,问题就就解决了?
防止1秒内被处理的文件获得的新名称都相同经过上面的改造,会发现问题减少了很多,不再经常“丢”图片了……但是,偶尔还是有照片丢失的情况发生……

知道原因吗?MSDN告诉我们:“Windows系统时钟精确到10~15毫秒”,也即说,DateTime类型只能精确到10~15毫秒。如果用时间命名,即便精确到毫秒,10~15毫秒内处理的文件,名字仍然会相同,有趣的bug仍然会产生。

故,不推荐使用日期时间命名文件。
有一种解决办法就是判断重名,如果文件名已经存在,那么就换一个名字,但是,这样每次都要判断。更要紧的是,随着时间的推移,现有的页面必然越来越多,每次生成都要遍历一下目录,岂不是很麻烦?虽然可能有比较好的搜索算法来提高效率,但是我想还不如从根本上解决这个问题更好。
 
那怎么办呢?用Guid!唯一的、一出生即与众不同的家伙,它的唯一性,理论上保证了同一目录下无可能出现重复的文件名。
string 新文件名 = Guid.NewGuid().ToString("N");
 
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。

 

 

利用IO修改文件名的方法

 

修改文件名:System.IO.File.Move("SourceFileName","targetFileName");
修改目录名:System.IO.Directory.Move("SourceFolderName","targetFolderName");

 

C#代码  收藏代码
  1. //Move方法的第一个参数必须是绝对路径.   
  2.   
  3. System.IO.File.Move(server.MapPath("相对路径"), "新文件名");  
  4.   
  5. System.IO.Directory.Move(Server.MapPath("相对路径"), ,"新文件夹名");  
  6.   
  7. String path= Server.MapPath("相对路径");  
  8. if (File.Exists(path))//判断该路径是否存在该文件  
  9. {  
  10.    File.Delete(path);//删除该文件  
  11.    File.Delete(path.Insert(path.LastIndexOf(@"\") + 1, "s_"));//删除缩略图  

0 0
原创粉丝点击