这几天在帮公司人力那边写一个邮件群发器,之前的开发过程都很顺利,就是在邮件发送完成之后删除项目下excel文件是出问题了,一直提示我"该文件已经被其他进程所占用,删除异常",字我记不住了,意思大概这样吧。当时我就纳闷了,文件流我也释放了并且关闭了,垃圾回收也加上了还是不能解决问题,几天在网上查了写资料,忽然发现既然文件被其他进程占用那我在写这个文件的时候先把文件流给锁上 这不就可以了嘛,果然,把流锁上立刻问题解决了。其实这也不是什么很难的问题,只不过我们有时候在处理问题的时候遗漏了一些东西或者没考虑全面而已。废话不多说了,我把处理代码帖上吧。
#region 把worksheet 另存为excel 杨大鑫
public static void SaveFile(Worksheet sheet, string sheetName, string fileName)
{
using (MemoryStream stream = OutFileToStream(sheet, sheetName))
{
using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write,FileShare.Write))
{
byte[] data = stream.ToArray();
fs.Lock(0, data.Length);//加锁,防止其他进程使用该文件,好处是:再同步删除该文件时候不会出现异常
fs.Write(data, 0, data.Length);
fs.Flush();
fs.Dispose();
fs.Close();
}
}
}
//把本地已经发送过得邮件 excel删除掉
foreach (Email mail in this.successEmails)
{
string filePath = myUtils.FileFolder + "SendFiles/" + mail.recipientEmail + ".xls";
if (File.Exists(filePath))
{
File.Delete(filePath);
//垃圾回收
GC.Collect();
}
}