2010-10-24 7 views
2

J'ajoute des images à un contrôle FlowLayoutPanel via le code suivantLe processus ne peut pas accéder au fichier car il est utilisé par un autre processus

Dim WithEvents Pedit As DevExpress.XtraEditors.PictureEdit 

Private Sub LoadImagesCommon(ByVal fi As FileInfo) 
     Pedit = New DevExpress.XtraEditors.PictureEdit 
     Pedit.Width = 133 
     Pedit.Height = 98 
     Pedit.Image = Image.FromFile(fi.FullName) 
     Pedit.Properties.SizeMode = DevExpress.XtraEditors.Controls.PictureSizeMode.Zoom 
     Pedit.ToolTip = fi.Name 
     AddHandler Pedit.MouseClick, AddressOf Pedit_MouseClick 
     AddHandler Pedit.MouseEnter, AddressOf Pedit_MouseEnter 
     AddHandler Pedit.MouseLeave, AddressOf Pedit_MouseLeave 
     FlowLayoutPanel1.Controls.Add(Pedit) 
    End Sub 

Le problème est que je reçois l'erreur suivante The process cannot access the file xxxx because it is being used by another process. lorsque je tente de supprime les images que j'ai chargées à l'étape précédente.

Alors qu'est-ce que je fais mal ici?

Répondre

5

Image.FromFile actually locks the file it loads et libère seulement le verrou une fois qu'il est disposé.

La solution consiste à dessiner l'image dans le contexte graphique d'une autre image (en la copiant ainsi efficacement) et à disposer l'image originale.

4

Aha! Merci Konrad. Après quelques lectures, j'ai trouvé une autre solution de contournement.

Dim fs As System.IO.FileStream 
fs = New System.IO.FileStream(fi.FullName, IO.FileMode.Open, IO.FileAccess.Read) 
Pedit.Image = System.Drawing.Image.FromStream(fs) 
fs.Close() 

Mise à jour: et voici ce que Konrad a suggéré. Pour tous les débutants là-bas, juste comme moi :)

Dim imgTemp As System.Drawing.Image 
imgTemp = System.Drawing.Image.FromFile(strFilename, True) 
Pedit.Image = New System.Drawing.Bitmap(imgTemp) 
imgTemp.Dispose() 
Pedit.Image.Save(strFilename) 

qui est mieux depuis l'objet image ne peut pas avoir sa méthode Save appelée après l'FileStream a été fermé.

+0

Votre solution est mieux que le mien. –

+0

Je crois le contraire. S'il vous plaît jeter un oeil à la mise à jour. – OrElse

0

Je trouve cette solution est la meilleure pour déverrouiller le fichier d'image après qu'il a été chargé à la PictureBox:

PictureBoxName .load (nom de fichier d'image avec le chemin complet)

Questions connexes