Почему GDI не позволяет мне удалять большие изображения? - PullRequest
2 голосов
/ 11 октября 2009

В моем приложении ASP.NET есть функции обрезки и изменения размера изображений. Это требует, чтобы загруженное временное изображение было удалено. Все работает нормально, но когда я пытаюсь удалить изображение размером более 80 на 80 пикселей, я получаю сообщение об ошибке «Файл заблокирован другим процессом ...», хотя я и освободил все ресурсы.

Вот фрагмент:

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);

Ответы [ 2 ]

1 голос
/ 11 октября 2009

Я думаю, вы не утилизируете первый экземпляр 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 голос
/ 11 октября 2009

Если вы создадите изображение таким образом, оно не будет заблокировано:

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
                }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...