這幾天在幫公司人力那邊寫一個郵件群發器,之前的開發過程都很順利,就是在郵件發送完成之后刪除項目下excel文件是出問題了,一直提示我"該文件已經被其他進程所占用,刪除異常",字我記不住了,意思大概這樣吧。當時我就納悶了,文件流我也釋放了並且關閉了,垃圾回收也加上了還是不能解決問題,幾天在網上查了寫資料,忽然發現既然文件被其他進程占用那我在寫這個文件的時候先把文件流給鎖上 這不就可以了嘛,果然,把流鎖上立刻問題解決了。其實這也不是什么很難的問題,只不過我們有時候在處理問題的時候遺漏了一些東西或者沒考慮全面而已。廢話不多說了,我把處理代碼帖上吧。
1、這是寫文件的時 處理辦法。
#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(); } } }
2、發送郵件完成后刪除文件的處理
//把本地已經發送過得郵件 excel刪除掉 foreach (Email mail in this.successEmails) { string filePath = myUtils.FileFolder + "SendFiles/" + mail.recipientEmail + ".xls"; if (File.Exists(filePath)) { File.Delete(filePath); //垃圾回收 GC.Collect(); } }