日期:2014-05-20  浏览次数:20863 次

急!!!!该进程无法访问文件 因为该文件正由另一进程使用
这个是三楼oa的代码。。在邮件发送附件的时候如果单独发不会出错。如果单独发了他再发他一次就出错。。群发就一定会出错。。。


出错的提示是:

该进程无法访问文件“D:\UDS\SubModule\UnitiveDocument\Mail\AttachFiles\yw135\93\RENZHENG2.GIF”,因为该文件正由另一进程使用。


出错代码是:(就在嵌套的foreach里面出的错。大概是file.create   file.copy那里出的错误)

try
{
listmail   =   mailclass.MailSend(mailbody);   //   返回已经发送的邮件ID列表(包括抄送和密抄)
//listattfile   =   AttUpload(mailbody.MailReceiverStr.ToString());   //   返回邮件附件数组
foreach(string   mailID   in   listmail)
{   //   循环发送邮件附件
foreach(UDS.Components.MailAttachFile   att   in   upattlist)
{   // 处理邮件附件的数据库操作部分  

Random   TempNameInt   =   new   Random();  
string   NewDocDirName   =   TempNameInt.Next(100000000).ToString();
Directory.CreateDirectory(Server.MapPath( ". ")+ "\\AttachFiles\\ "+Username+ "\\ "+NewDocDirName);
//File.Move(Server.MapPath( ". ")+ "\\ "+att.FileVisualPath   ,Server.MapPath( ". ")+ "\\AttachFiles\\ "+Username+ "\\ "+NewDocDirName+ "\\ "+att.FileName);
File.Copy(Server.MapPath( ". ")+ "\\ "+att.FileVisualPath   ,Server.MapPath( ". ")+ "\\AttachFiles\\ "+Username+ "\\ "+NewDocDirName+ "\\ "+att.FileName,true);

//Directory.Delete(Server.MapPath( ". ")+ "\\ "+att.FileVisualPath.ToString().Replace(att.FileName, " "),true);
att.FileVisualPath   =   "\\AttachFiles\\ "+Username+ "\\ "+NewDocDirName+ "\\ "+att.FileName;
mailclass.AttSend(att,Int32.Parse(mailID));
}
}

if(cblistAttribute.Items[1].Selected&&Request.Form[ "hdnProjectID "].ToString()!= "0 ")
{
    DocProcess(mailbody,upattlist);
}

Response.Write( " <script   language=javascript> alert( '邮件发送成功! ');if(parent.frames.length==0)   window.close();else   self.location=( 'Index.aspx '); </script> ");
}
catch   (Exception   sendex)
{
    UDS.Components.Error.Log(sendex.ToString());
    Server.Transfer( "../../Error.aspx ");
}


希望能讲清楚些,谢谢

------解决方案--------------------
被锁定了,正在被访问.是不是有个线程在用它?
------解决方案--------------------
估计 是 发送 第一次后
没有即时的 释放对于 附件文件的 占用造成的
楼主看看 对于附件操作的的时候 发送完毕 比如数据流读取这样的操作应该即时的释放掉

------解决方案--------------------
代码不完整
如果你的att 是 Attachment 类
那么在发送完毕后 添加 att.Dispose(); 就应该不会再占用该文件
------解决方案--------------------
up
------解决方案--------------------
up
------解决方案--------------------