2009-10-10 20 views
2

Mon application ASP.NET comporte des fonctions de recadrage et de redimensionnement d'image. Cela nécessite que l'image temporaire téléchargée soit supprimée. Tout fonctionne bien, mais quand j'essaie de supprimer une image plus grande que 80px par 80px, j'obtiens une erreur "Le fichier est verrouillé par un autre processus ...", même si j'ai libéré toutes les ressources.Pourquoi GDI ne me laisse-t-il pas supprimer de grandes images?

Voici un extrait:

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

Répondre

1

Je pense que vous n'êtes pas disposer la première instance d'image attribué à la img variable.

Tenir compte ceci:

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

Si vous créez l'image de cette façon, il ne sera pas verrouillé

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

Ce code est incorrect. La documentation pour Image.FromStream indique "Vous devez garder le flux ouvert pour la durée de vie de l'image." Le code ci-dessus ne le fait pas. Et, s'il le faisait, le fichier resterait verrouillé. –

+0

J'ai édité ma réponse. Vous avez maintenant un flux qui reste ouvert et le fichier ne sera pas verrouillé. – codymanix