Meilleur auteur de réponses
Le processus ne peut pas accéder au fichier etc

Question
-
Bonjour
'j'ai un fichier jpg
dim img as image
dim ms as IO.memorystream= NEW IO.memorystream(IO.file.RealAllBytes(monfichier_jpg))
img=ctype(image.fromstream(ms),image)
PictureBox.image=img
'je sauve cette img
img.save (nom_fichier_jpg_2 , imageformat.Jpeg)
'jusque là tout va bien
MAIS JE NE PEUX DELETE le fichier saved nom_fichier_jpg_2
my.computer.filesystem.deletefile(nom_fichier_jpg_2) --> erreur
il semble que le problème tourne autour de "gdi keeps a lock on files" dans google
mais mes connaissances en informatique et en anglais ne me permettent pas d'aller plus loin.
http://stackoverflow.com/questions/18250848/how-to-prevent-the-image-fromfile-method-to-lock-the-file
qu'en pensez vous ?
merci
Réponses
-
Bonjour,
Essayer ceci ça fonctionne très bien aucune erreur afficher et j'ai déjà essayer sur Windows 10:
Imports System.IO Public Class Form1 Private img As Image Private format As String = My.Computer.FileSystem.SpecialDirectories.MyPictures & "\erreur.jpg" Private format2 As String = My.Computer.FileSystem.SpecialDirectories.MyPictures & "\test.jpg" Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click Dim lire As MemoryStream = New MemoryStream(File.ReadAllBytes(format)) img = CType(Image.FromStream(lire), Image) PictureBox1.Image = img img.Save(format2, Drawing.Imaging.ImageFormat.Jpeg) If File.Exists(format2) Then File.Delete(format2) End If End Sub Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load PictureBox1.BorderStyle = BorderStyle.FixedSingle PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage End Sub End Class
Maintenant a toi jouer.
cordialement zorro591
- Marqué comme réponse Emile Supiot jeudi 3 décembre 2015 13:51
Toutes les réponses
-
Bonjour, PRVB66,
Veuillez consulter le thread en bas:
PictureBox "locks" file, cannot move/delete
Je vous remercie par avance de votre retour.Cordialement,
TeodoraVotez! Appel à la contribution TechNet Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.
-
-
Bonjour,
Voici une solution qui marche parfaitement :
Mon code :
Public Class Form1 Private FilePath As String Dim SaveFile As New SaveFileDialog Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load PictureBox1.BorderStyle = BorderStyle.FixedSingle PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage End Sub Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click Dim open As New OpenFileDialog open.Title = "Ouverture de l'image" open.InitialDirectory = My.Computer.FileSystem.SpecialDirectories.MyPictures open.Filter = "Format image(jpg)|*.jpg" If open.ShowDialog = Windows.Forms.DialogResult.OK Then Me.FilePath = open.FileName PictureBox1.ImageLocation = Me.FilePath Else MessageBox.Show("Aucune image séléctionner", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error) End If End Sub Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click If Not Me.FilePath = Nothing Then SaveFile.Title = "Enregistrement l'image" SaveFile.Filter = "Jpeg (*.jpeg)|*.jpeg" If SaveFile.ShowDialog = Windows.Forms.DialogResult.OK Then PictureBox1.Image.Save(SaveFile.FileName, System.Drawing.Imaging.ImageFormat.Jpeg) MessageBox.Show("Enregistrement Terminer", "Enregistrer", MessageBoxButtons.OK, MessageBoxIcon.Information) Else MessageBox.Show("Aucune image enregistrer", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error) End If Else MessageBox.Show("Aucun image trouver", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error) End If End Sub Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click If Not Me.FilePath = Nothing Then My.Computer.FileSystem.DeleteFile(SaveFile.FileName) MessageBox.Show("Effacement reussite", "Effacer", MessageBoxButtons.OK, MessageBoxIcon.Information) Else MessageBox.Show("Aucun image trouver", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error) End If End Sub End Class
J'espére la solution vous aidera a ton problème.
Par Zorro591
-
Reponse à Teodora Sharkova et zorro591
Désolé, aucune des propositions ne marche.
La plus efficace, mais aléatoire, est la suivante:
https://social.msdn.microsoft.com/Forums/vstudio/en-US/b15357f1-ad9d-4c80-9ec1-92c786cca4e6/bitmapsave-a-generic-error-occurred-in-gdi?forum=netfxbcl
'GDI+ keeps a lock on files from which an image was contructed.
'To avoid the lock, construct the image from a MemorySteam:
'ReadAllBytes=Ouvre un fichier binaire, lit le contenu du fichier
'dans un tableau d'octets, puis FERME LE FICHIER
dim ms As IO.MemoryStream = New IO.MemoryStream(IO.File.ReadAllBytes(Nom_Fichier_Complet))
img = CType(Image.FromStream(ms), Image)
ce qui est étonnant c'est que tout le monde tourne autour de l'image alors que le problème est le lock du fichier
et que lorsqu'on arrive à delete le fichier c'est que le garbage collector est passé par là
(enfin il me semble)
D'autre part le fichier que le code ne peut supprimer, est supprimé sans difficulté dans explorateur window. (window 7 edition familiale premium -service pack 1)
-
Bonjour,
Essayer ceci ça fonctionne très bien aucune erreur afficher et j'ai déjà essayer sur Windows 10:
Imports System.IO Public Class Form1 Private img As Image Private format As String = My.Computer.FileSystem.SpecialDirectories.MyPictures & "\erreur.jpg" Private format2 As String = My.Computer.FileSystem.SpecialDirectories.MyPictures & "\test.jpg" Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click Dim lire As MemoryStream = New MemoryStream(File.ReadAllBytes(format)) img = CType(Image.FromStream(lire), Image) PictureBox1.Image = img img.Save(format2, Drawing.Imaging.ImageFormat.Jpeg) If File.Exists(format2) Then File.Delete(format2) End If End Sub Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load PictureBox1.BorderStyle = BorderStyle.FixedSingle PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage End Sub End Class
Maintenant a toi jouer.
cordialement zorro591
- Marqué comme réponse Emile Supiot jeudi 3 décembre 2015 13:51
-
Après avoir tourner le problème dans tous les sens je suis arrivé à la conclusion suivante:
Lorsqu'on charge une image dans le picturebox, il est impossible BY DESIGN de supprimer le fichier correspondant qui est locked, c'est voulu par MS. J'entends 'par impossible de le supprimer' le fait d'être sur que delete ne va pas déclencher l'erreur "Le processus ne peut pas accéder au fichier etc". Sinon c'est le hasard du garbage collector qui permet la suppression(je crois)
Mon problème était le suivant: j'avais une liste de 10 fichiers, je sélectais l'item 6 de la liste
ce qui affichait l'image correspondante dans le picturebox et je faisais file.delete "fichier_6" --> échec
Ce qu'il faut faire c'est "relever le nom du fichier_6", CHARGER l'image 5 ou 7 (ou autre) dans le picturebox PUIS supprimer le fichier dont on a précédemment relever le nom !!!
donc inverser l'ordre des 2 actions. et il n'y a JAMAIS d'erreur ... voila pourquoi votre fille est muette.
Reste un petit problème, que fait on lorsqu'il ne reste qu'un fichier dans ma liste ?
image.dispose, picturebox.dispose, stream.close ??