您的位置:首页 > 编程语言 > ASP

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

2015-04-08 16:38 946 查看
文件上传时为了避免覆盖掉文件名相同的文件,一般都是采用系统时间当文件名,精确到毫秒,这样可以防止上传文件冲突 

Java代码  


string name = this.FileUpload1.FileName;   
string type = name.Substring(name.LastIndexOf(".") + 1);   
//获取上传文件的后缀   
  
if (name != "")   
{   
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;   
//更改上传文件名   
  
string path = Server.MapPath("upfiles") + "\\" + newName;   
FileUpload1.SaveAs(path);   
}  

 
 
以上示例精确到毫秒,问题就就解决了?
防止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#代码  


//Move方法的第一个参数必须是绝对路径.   
  
System.IO.File.Move(server.MapPath("相对路径"), "新文件名");  
  
System.IO.Directory.Move(Server.MapPath("相对路径"), ,"新文件夹名");  
  
String path= Server.MapPath("相对路径");  
if (File.Exists(path))//判断该路径是否存在该文件  
{  
   File.Delete(path);//删除该文件  
   File.Delete(path.Insert(path.LastIndexOf(@"\") + 1, "s_"));//删除缩略图  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: