首页 > 系统相关 >C#邮件带附件发送成功后附件文件不能及时删除,报错该进程无法访问路径“”,因为它正在被另一个进程使用

C#邮件带附件发送成功后附件文件不能及时删除,报错该进程无法访问路径“”,因为它正在被另一个进程使用

时间:2023-08-27 09:22:23浏览次数:32  
标签:string 无法访问 System 进程 File 附件 邮件 msg

背景
在做邮件发送因为附件file控件是动态产出的,在后台只能以httpfilecollection方式循环获取,
因为IE和FireFox兼容问题,IE下File.FileName获取的是文件的全路径而在FireFox下就只能获取到文件名,
导致Attachment attchment = new Attachment(File.FileName);火狐下会出错,
因为File.SaveAs(File.FileName) 方法不存在FireFox和IE不兼容的问题,
笨方法,先把附件通过File.SaveAs(File.FileName) 方法上传到服务器上,
问题
邮件发送成功后再删除此文件,会一直报错异常“文件不能删除,另一个进程正在使用”;
原因及处理方式
以为File文件流的问题,真实原因是附件上传成功后需要释放的原因。
代码如下: string attchemUrlstrs = ""; //设置出错时提示的语句数组 string[] MsgStr = new string[3]; MsgStr[0] = "上传文件大小超过限制."; MsgStr[1] = "上传文件扩展名是不允许的扩展名."; MsgStr[2] = "上传文件失败\\n请重试."; int MaxSize = 2048000; string SavePath = "./../../Upload/Attachments/"; MailMessage msg = new MailMessage(); msg.From = new MailAddress(address);# #region 循环添加附件 HttpFileCollection fileList = HttpContext.Current.Request.Files; try { int attSizeCount = 0; ///上载文件列表中的每一个文件 for(int i = 0; i < fileList.Count; i++) { ///获取当前上载的文件 HttpPostedFile File = fileList[i]; //获得文件名 string FileName = System.IO.Path.GetFileName(File.FileName); if(FileName != "") {# region 上传附件到服务器( 这样做是为了ie和firefox不兼容, ie得到的是文件的全路径, 而火狐是文件名) string fileExtension = System.IO.Path.GetExtension(FileName).ToLower(); string imgReName = "" + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss-ffff", DateTimeFormatInfo.InvariantInfo) + "" + fileExtension; //文件夹名 string imgFolderName = DateTime.Now.ToString("yyyyMMdd", DateTimeFormatInfo.InvariantInfo); try { if(!System.IO.Directory.Exists(@Server.MapPath("" + SavePath + "" + imgFolderName + ""))) { //生成文件完整目录 System.IO.Directory.CreateDirectory(@Server.MapPath("" + SavePath + "" + imgFolderName + "")); } File.SaveAs(@Server.MapPath("" + SavePath + "" + imgFolderName + "/") + imgReName); } catch { Response.Write("<script type=\"text/javascript\">alert(\"附件上传总大小不能超过200k\");</script>"); return; } attchemUrlstrs += @Server.MapPath(SavePath + imgFolderName + "/" + imgReName) + ";"; //记录附件地址 Attachment attchment = new Attachment(@Server.MapPath(SavePath + imgFolderName + "/" + imgReName)); //得到附件的绝对地址 msg.Attachments.Add(attchment); attSizeCount += File.ContentLength;# endregion } } if(attSizeCount > MaxSize) { Response.Write("<script type=\"text/javascript\">alert(\"" + MsgStr[0] + ",附件上传总大小不能超过200k\");</script>"); return; } } catch(Exception ex) { ///显示上载文件的操作失败消息 Response.Write("<script type=\"text/javascript\">alert(\"" + ex.ToString() + ",附件上传总大小不能超过200k\");</script>"); return; }
#endregion //邮件发送地址 string to = this.txtTo.Text; if(to != "" && to != null) { string[] ccAddress = to.Split(','); foreach(string emailTo in ccAddress) { if(emailTo.Trim() != "") { msg.To.Add(emailTo); } } } msg.Subject = this.txtSubject.Text; //邮件标题 msg.SubjectEncoding = System.Text.Encoding.UTF8; //邮件编码 msg.Body = this.content1.Text; //邮件内容 msg.BodyEncoding = System.Text.Encoding.UTF8; msg.IsBodyHtml = true; //是否是html SmtpClient client = new SmtpClient(); if(type == "0") { address = address.Substring(0, address.Length - (address.Length - address.LastIndexOf('@'))); client.Credentials = new System.Net.NetworkCredential(address, emailpass); } if(type == "1") { client.Credentials = new System.Net.NetworkCredential(address, emailpass); } client.Host = server; //发送邮件服务器smtp:25,接收邮件服务器pop:110 client.EnableSsl = false; client.Port = 25; try { client.Send(msg); //发送邮件 Response.Write("<script language='javascript'>alert('邮件发送成功')</script>"); } catch(System.Net.Mail.SmtpException ex) { Response.Write("<script language='javascript'>alert('邮件发送失败,原因是:" + ex.ToString() + ")</script>"); } finally { foreach(Attachment item in msg.Attachments) { item.Dispose(); //一定要释放该对象,否则无法删除附件 }
#region 不论邮件是否发送成功, 删除服务器上临时附件 string[] attchemUrllist = attchemUrlstrs.Split(';'); foreach(string attchemUrl in attchemUrllist) { if(attchemUrl != "") { if(System.IO.File.Exists(attchemUrl)) { try { System.IO.File.Delete(attchemUrl); } catch(Exception ex) { ex.ToString(); } } } }
#endregion }

 

标签:string,无法访问,System,进程,File,附件,邮件,msg
From: https://www.cnblogs.com/turnip/p/17659854.html

相关文章

  • cpu-模拟进程上下文切换
    目录1、升级环境,安装stress-ng工具2、进程上下文切换-模拟场景3、进程上下文切换-top命令4、vmstat1命令-每隔1s显示一次数据5、pidstat-w3-找有问题的进程id6、总结7、分析过程-找到有问题的进程正文 1、升级环境,安装stress-ng工具#安装epel源,更新系统......
  • Python多进程用法
    Python的多进程用法主要是通过`multiprocessing`模块实现的。以下是一个简单的示例: 1.首先,导入`multiprocessing`模块。2.定义一个要在多个进程中运行的函数。3.使用`multiprocessing.Process`类创建多个进程对象。4.调用进程对象的`start()`方法启动进程。5.使用`joi......
  • Cisco OSPF多进程重分布
    和ospf与rip重分布类似就是两个ospf进程号别给一样然后宣告网段中间的路由器进ospf1宣告左边一段再进ospf2宣告右边一段然后重分布ospf1里面就重分布为ospf2类型ospf2里面就重分布为ospf1类型......
  • 无涯教程-进程 - 管道(Pipes)
    管道是两个或多个相关进程之间的通信介质,它可以在一个进程内,也可以在子进程与父进程之间进行通信。可以实时查看管道机制,例如用管道将水填充到某个容器(例如桶)中,然后取回某人(例如用杯子)。填充进程只不过是写入管道,而读取进程只不过是从管道中检索,这意味着一个输出(水)被输入......
  • 02 程序,进程,线程
    程序——>进程——>线程程序:静态的进程:动态的,程序运行起来的的过程线程:由一个或者多个线程组成进程。eg:运行qq是一个进程,但有着很多的线程......
  • 无涯教程-进程 - 其它进程
    到目前为止,我们已经讨论了进程,进程的创建,父进程和子进程等。如果不讨论其他相关进程(如孤立进程,僵尸进程和守护进程),则将是不完整的。孤立进程当我们运行程序或应用程序时,该应用程序的父进程是shell,当我们使用fork()创建进程时,新创建的进程是子进程,而创建子进程的进程是父进程......
  • 无涯教程-进程 - 创建&终止
    到现在为止,我们知道无论何时执行程序,都会创建一个进程,并且该进程将在执行完成后终止,如果我们需要在程序中创建一个进程,并且可能希望为其安排其他任务,该怎么办。能做到吗?是的,显然是通过进程创建的,当然,工作完成后,它将自动终止,或者您可以根据需要终止它。进程创建是通过fork()系......
  • 无涯教程-进程 - 子进程监控
    正如我们所看到的,每当我们使用fork从程序创建子进程时,都会发生以下情况-当前进程成为父进程新进程成为子进程如果父进程比子进程提前完成任务然后退出,会发生什么?现在谁将成为子进程的父进程?子进程的父进程是init进程,它是启动所有任务的第一个进程。为了监视子进程的执行状......
  • 无涯教程-进程 - 镜像
    现在,我们已经了解了如何获取进程及其父进程的基本信息,是时候来研究进程信息的细节了。以下是进程镜像的图形表示。进程镜像(ProcessImage)到底是什么?进程镜像是执行程序时所需的可执行文件,该镜像通常包含以下部分-代码段或文本片段(Codesegmentortextsegment)数据段(Da......
  • 无涯教程-进程 - 信息
    在进入进程信息之前,我们需要了解一些事情,例如-  什么是进程? 进程是正在执行的程序。  什么是程序? 程序是一个文件,其中包含进程的信息以及在运行时如何进行构建。当您开始执行程序时,它将被加载到RAM中并开始执行。每个进程都用唯一的正整数标识,称为进程ID或简......