2009-10-10 71 views
2

我的ASP.NET應用程序具有圖像裁剪和調整大小功能。這要求刪除上傳的臨時圖像。一切工作正常,但是當我嘗試刪除大於80像素80像素的圖像時,我得到「文件被另一個進程鎖定...」錯誤,即使我已經發布了所有資源。爲什麼GDI不讓我刪除大圖片?

這裏有一個片段:

System.Drawing.Image tempimg = System.Drawing.Image.FromFile(temppath); 
System.Drawing.Image img = (System.Drawing.Image) tempimg.Clone(); //advice from another forum 
tempimg.Dispose(); 

img = resizeImage(img, 200, 200); //delete only works if it's 80, 80 
img.Save(newpath); 
img.Dispose(); 

File.Delete(temppath); 

回答

1

我想你是不是處置分配給第一Image實例img變量。

考慮這個:

System.Drawing.Image tempimg = System.Drawing.Image.FromFile(temppath); 
System.Drawing.Image img = (System.Drawing.Image) tempimg.Clone(); 
tempimg.Dispose(); 

System.Drawing.Image img2 = resizeImage(img, 200, 200); 
img2.Save(newpath); 
img2.Dispose(); 
img.Dispose(); 

File.Delete(temppath); 
1

如果你創建這個圖片的方式,它不會被鎖定:

using (FileStream fs = new FileStream(info.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
       { 
        byte[] data = new byte[fs.Length]; 
        int read = fs.Read(data, 0, (int)fs.Length); 
        MemoryStream ms = new MemoryStream(data, false); 
        return Image.FromStream(ms, false, false); // prevent GDI from holding image file open 
       } 
+0

此代碼是不正確的。 Image.FromStream的文檔聲明「您必須保持該流在圖像的整個生命週期中處於打開狀態。」上面的代碼沒有這樣做。而且,如果確實如此,該文件將保持鎖定狀態。 – 2009-10-10 22:07:13

+0

我編輯了我的答案。現在你有一個流保持打開狀態,文件不會被鎖定。 – codymanix 2009-10-10 22:33:32