2009-10-10 3 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

Я думаю, что вы не располагая первый экземпляр изображения, назначенного на 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 гласит: «Вы должны держать поток открытым для жизни Image». Вышеприведенный код этого не делает. И, если это так, файл останется заблокированным. –

+0

Я отредактировал свой ответ. Теперь у вас есть поток, который остается открытым, и файл не будет заблокирован. – codymanix