2012-04-24 80 views
1

我得到這個錯誤ASP.NET MVC刪除文件?

The process cannot access the file '..\Images\Temp\6574_1212665562989_1419270107_30610848_6661938_n.jpg' because it is being used by another process. 

當我嘗試這樣做:

try 
{ 
    var file = Request.Files["FileProfilePicture"]; 
    file.SaveAs(Server.MapPath("~/Images/Temp/" + file.FileName)); 
    Bitmap imageOrj = new Bitmap(System.Web.HttpContext.Current.Server.MapPath("~/Images/Temp/" + file.FileName)); 
    Image imageBig = ResizeImage.Resize(imageOrj, 100, 100); 
    imageBig.Save(System.Web.HttpContext.Current.Server.MapPath("~/Images/ProfilePicBig/" + file.FileName)); 
    Image imageSmall = ResizeImage.Resize(imageOrj, 50, 50); 
    imageSmall.Save(System.Web.HttpContext.Current.Server.MapPath("~/Images/ProfilePicSmall/" + file.FileName)); 

    string[] files = System.IO.Directory.GetFiles(Server.MapPath("~/Images/Temp/")); 
    foreach (string pathFile in files) 
    { 
     System.IO.File.Delete(pathFile); 
    } 


    return RedirectToAction("Index", "Author"); 
} 
catch (Exception e) 
{ 
    ModelState.AddModelError("", "Kullanıcı bilgileri güncellenirken bir hata oluştu. Lütfen daha sonra tekrar deneyin." + e.Message); 
} 

我怎樣才能解決這個問題。或者另一種更好的方式來保持圖像作爲臨時。我應該將文件保存在臨時文件夾中嗎?

謝謝

回答

1

你確定你沒有在臨時打開其他地方的文件?

此錯誤也當你在前面跑了一個錯誤,該文件尚未關閉發生。在這種情況下,您可以嘗試使用不同的文件名,或者從操作系統端刪除未關閉的文件。

我希望這有助於...

否則,我通常用做臨時文件的類似的方式...

編輯:所作的評論,似乎爲解決這一問題上面是以下內容:無論何時在try-catch塊中處理,文件對象可能不會在關閉節點中處理時關閉。 在這種特定情況下,imageOrj對象導致了此問題,所以建議在位圖編輯完成後使用imageOrj.Dispose()

+0

保存後如何關閉文件。 – 2012-04-24 12:55:29

+1

我不確定FileStream()。Close()會解決它,它不是一個FileStream,而是一個HttpPostedFileBase。但SaveAs方法不應該打開文件,只是從字面上創建一個副本(或者將HttpPostedFile刷新到該文件中),因此它必須是引發抖動的Bitmap對象......這意味着這是保持文件打開的文件,所以我想你可以在完成Bitmap後使用imageOrj.Dispose()... – army 2012-04-24 18:27:11

+0

我認爲Jakub的文章中的鏈接是一個很好的例子,所以如果這能解決你的問題,你可以接受.. – army 2012-04-24 18:29:17

1

您不需要保存臨時文件。您可以在內存中創建位圖並使用請求流進行填充。沒有必要將它保存到磁盤。

+0

我該怎麼做。有沒有鏈接,教程或一些代碼? – 2012-04-24 12:30:13

+0

http://forums.asp.net/t/1576697.aspx/1 – 2012-04-24 13:40:27

-1

您似乎刪除了多於您在刪除循環中創建的文件。您試圖刪除〜/ Images/Temp /下的每個文件,這可能會導致衝突(即不同請求之間的數據競爭)。只刪除剛創建的文件。

+0

我認爲,這並不重要。 – 2012-04-24 13:00:32

+0

這怎麼不重要?設想兩個併發請求,這兩個請求都創建不同的文件,其中一個請求將盡早完成,並嘗試刪除第一個請求已在使用的文件。在臨時目錄中顯然存在數據競爭:-) – nakhli 2012-04-25 08:13:35