none
Le processus ne peut pas accéder au fichier etc RRS feed

  • 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

    mercredi 11 novembre 2015 17:26

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
    dimanche 15 novembre 2015 08:07

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,
    Teodora


    Votez! 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.

    jeudi 12 novembre 2015 15:02
    Modérateur
  • Félicitations pour votre lien qui décrit très précisément mon problème.

    Je vais étudier tout cela à tête reposée et je ne manquerai pas

    de marquer votre réponse comme une solution.

    Encore merci !

    jeudi 12 novembre 2015 15:53
  • 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

    jeudi 12 novembre 2015 16:44
  • 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)

    samedi 14 novembre 2015 10:22
  • 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
    dimanche 15 novembre 2015 08:07
  • 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 ??

    mardi 17 novembre 2015 15:35