IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[VB.NET] Comment supprimer un fichier qui est utilisé ? [Trucs & Astuces]


Sujet :

Windows Forms

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 6
    Points : 5
    Points
    5
    Par défaut [VB.NET] Comment supprimer un fichier qui est utilisé ?
    Bonjour,

    voici ma petite question :

    dans mon application j'affiche l'image "c:\image1.gif" ds pictureBox1. Dans la même application l'image est utilisée par une ImageList.

    Ensuite je liberes l'image : pictureBox1.Image.Dispose().

    Je veux utiliser dans mon code la commande file.delete("c:\image1.gif") mais ce fichier est utilsé par un processus que je n'arrives pas à deceler.

    Peut-on forcer la suppresion d'un fichier lorsqu'il est encore utilisé par un processus ?

    Merci pour toute idée car je suis vraiement blocked.

  2. #2
    Membre chevronné
    Avatar de Piotrek
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 869
    Points : 1 904
    Points
    1 904
    Par défaut
    Cela vient probablement du fait que l'image est encore dans la ImageList

    Essaie de l'enlever de la-bas aussi (ImageList.images.removeAt(index) je crois)

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 6
    Points : 5
    Points
    5
    Par défaut [vb.net]
    Cela ne marche pas, j'ai même essayé de faire :

    ImageList.Images(0).Dispose() et je n'arives pas à liberer le fichier.

    En tout cas merci pour ton idée

  4. #4
    Membre chevronné
    Avatar de Piotrek
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 869
    Points : 1 904
    Points
    1 904
    Par défaut
    Ok j'ai cherche un peu et j'ai une hypothese: apparement ca se produit que quand visual studio est lance (ferme vs.net et lance l'appli seule pour verifier)

    Il existe un moyen pour contourner le pb lors de la conception du programme:

    http://support.microsoft.com/default.aspx?scid=kb;EN-US;309482

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    J'ai essayé le programme en quittant vb.net mais cela ne marche tjs pas.

    Le problème vient du fait que l'image est liée à une ImageList et non pas de la PictureBox. (je suis sûr)

    Voila mon code whaaaa :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    Private Sub But_Delete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles But_Delete.Click
     
     
     
            ' je parcours le dossier c:\IMAGES\ et je construis ma ListView et ma ImageList
            ' je précise que ListView1.LargeImageList=ImageList_Thumb
     
            PictureBox_Apercu.Image = Bitmap.FromFile(TextBox_FileName.Text)
     
    	Dim ImageListLocal As New ImageList
            Dim i As Integer = 0
     
    	Dim oFS As New DirectoryInfo("c:\IMAGES\")
            Dim ofile As FileInfo
     
            For Each ofile In oFS.GetFiles()
                If ofile.Extension() = ".gif" Or ofile.Extension() = ".GIF" Or ofile.Extension() = ".jpg" Or ofile.Extension() = ".bmp" Then
                    Dim item1 As New ListViewItem("", i)
                    item1.Text = Mid(ofile.FullName(), InStrRev(ofile.FullName(), "\") + 1)
                    ListView1.Items.Add(item1)
                    ImageList_Thumb.Images.Add(Image.FromFile(ofile.FullName()))
                    ImageListLocal.Images.Add(Bitmap.FromFile(ofile.FullName()))
                    i = i + 1
     
                End If
            Next
     
     
            ImageListLocal.Images(0).Dispose()
     
            PictureBox_Apercu.Image.Dispose()
     
            File.Delete(TextBox_FileName.Text)
     
     
     
     
        End Sub
    End Class
    merci bcp pour ton aide, si tu as d'autres idées n'hésite pas Alexandru

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    le code que j'avais inclu n'était pas le bon voici le nouveau code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    Private Sub But_Delete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles But_Delete.Click 
     
            ' je parcours le dossier c:\IMAGES\ et je construis ma ListView et ma ImageList 
     
            PictureBox_Apercu.Image = Bitmap.FromFile(TextBox_FileName.Text) 
     
       Dim ImageListLocal As New ImageList 
            Dim i As Integer = 0 
     
       Dim oFS As New DirectoryInfo("c:\IMAGES\") 
            Dim ofile As FileInfo 
     
            For Each ofile In oFS.GetFiles() 
                If ofile.Extension() = ".gif" Then 
                    Dim item1 As New ListViewItem("", i) 
                    item1.Text = Mid(ofile.FullName(), InStrRev(ofile.FullName(), "\") + 1) 
                    ListView1.Items.Add(item1) 
                    ImageListLocal.Images.Add(Bitmap.FromFile(ofile.FullName())) 
                    i = i + 1 
     
                End If 
            Next 
     
            ImageListLocal.Images(0).Dispose() 
     
            PictureBox_Apercu.Image.Dispose() 
     
            File.Delete(TextBox_FileName.Text) 
     
        End Sub 
    End Class


    merci bcp pour ton aide, si tu as d'autres idées n'hésite pas Alexandru

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Juste comme ça à vue de nez, tu ajoutes dans la collection tous les .gif que tu trouves. Rien ne dit que celui correspondant à TextBox_FileName.Text soit le premier.

    Tu as essayé en appelant Dispose sur tous les éléments de la liste ?

  8. #8
    Membre chevronné
    Avatar de Piotrek
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 869
    Points : 1 904
    Points
    1 904
    Par défaut
    je suis de l'avis de Maniak, faut enlver la bonne image de l'ImageList

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    J'ai essayé une belle boucle sur tous les indices cela ne marche pas...

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 7
    Points : 9
    Points
    9
    Par défaut
    Je vous préviens je vais peut-être dire une bêtise ;-)

    J'ai vu que vous parliez de libérer des ressourses et tout ça afin de pouvoir accéder à une image qui a été utilisée mais ne l'est plus.

    Si j'ai bien compris le fonctionnement du .NET, en fait tout marche par pointeurs, un pointeur sur une string, un pointeur sur une imageList (?)
    Ah non c'est vrai en .NET on dit une référence pour faire moins peur

    Bref au moment où on détruit une référence, par exemple truc était égal (pointé sur) monObjet et ensuite on fait truc = nothing ou truc.dispose ben en fait ça ne détruit pas monObjet, ça fait pointer truc vers un vide (nothing) et ensuite il y a le garbage collector ou ramasse-miettes de .NET qui passe pour détruire tout seul les objets sur lequel plus personne ne pointe.

    Donc l'imageList ou ton objet x existe toujours et on ne sait pas du tout quand le garbage collecor va passer donc on ne sait pas quand l'objet va enfin être détruit (c'est qd il a le temps...) mais on peut forcer le gabarge collector avec l'instruction GC.Collect

    Peut-être que ton pb vient de là... c'est juste une idée... j'espère que je dis pas des trucs trop tordus

    a+
    Fourmi

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    VOICI LA SOLUTION :
    je précise que finalement la solution est d'utiliser ensemble GC.Collect() kill(path_file) ; car delete.file(path) ne fonctionne tjs pas...

    Et ça marche dans tous les cas même qd le fichier est ouvert avec Paint en même temps...

    et merci à la fourmi qui me redonne le goût de vivre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    Private Sub But_Afficher_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles But_Afficher.Click
            PictureBox_Apercu.Image = Bitmap.FromFile(TextBox_FileName.Text) '    
        End Sub
     
     
    Private Sub But_Delete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles But_Delete.Click
            Dim ImageListLocal As New ImageList
     
            Dim i As Integer = 0
            Dim oFS As New DirectoryInfo("c:\IMAGES\")
            Dim ofile As FileInfo
            For Each ofile In oFS.GetFiles()
                If ofile.Extension() = ".gif" Or ofile.Extension() = ".GIF" Or ofile.Extension() = ".jpg" Or ofile.Extension() = ".bmp" Then
                    ImageListLocal.Images.Add(Bitmap.FromFile(ofile.FullName()))
                    i = i + 1
                End If
            Next
     
            Dim j As Integer
            For j = 0 To 8 Step 1
                ImageListLocal.Images(j).Dispose()
            Next
     
            PictureBox_Apercu.Image.Dispose()
     
            PictureBox_Apercu.Image = Nothing  'je désaffiche l'image de la frame
     
            GC.Collect()   'c'est effectivement ce qui permet de liberer les ressources images
     
            Kill(TextBox_FileName.Text)  'effectivement le fichier est supprimé (tout en force...) oufffffffffffffffffffffffffffffff
     
            'File.Delete(TextBox_FileName.Text) 
            'CHOSE TRES ETONANATE ! si j'utilises cette méthode le fichier n'est pas supprimé
            'car il est encore utilisé par un autre processus
     
        End Sub

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 48
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par Toon94 Voir le message
    VOICI LA SOLUTION :
    je précise que finalement la solution est d'utiliser ensemble GC.Collect() kill(path_file) ; car delete.file(path) ne fonctionne tjs pas...

    Et ça marche dans tous les cas même qd le fichier est ouvert avec Paint en même temps...

    et merci à la fourmi qui me redonne le goût de vivre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    Private Sub But_Afficher_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles But_Afficher.Click
            PictureBox_Apercu.Image = Bitmap.FromFile(TextBox_FileName.Text) '    
        End Sub
     
     
    Private Sub But_Delete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles But_Delete.Click
            Dim ImageListLocal As New ImageList
     
            Dim i As Integer = 0
            Dim oFS As New DirectoryInfo("c:\IMAGES\")
            Dim ofile As FileInfo
            For Each ofile In oFS.GetFiles()
                If ofile.Extension() = ".gif" Or ofile.Extension() = ".GIF" Or ofile.Extension() = ".jpg" Or ofile.Extension() = ".bmp" Then
                    ImageListLocal.Images.Add(Bitmap.FromFile(ofile.FullName()))
                    i = i + 1
                End If
            Next
     
            Dim j As Integer
            For j = 0 To 8 Step 1
                ImageListLocal.Images(j).Dispose()
            Next
     
            PictureBox_Apercu.Image.Dispose()
     
            PictureBox_Apercu.Image = Nothing  'je désaffiche l'image de la frame
     
            GC.Collect()   'c'est effectivement ce qui permet de liberer les ressources images
     
            Kill(TextBox_FileName.Text)  'effectivement le fichier est supprimé (tout en force...) oufffffffffffffffffffffffffffffff
     
            'File.Delete(TextBox_FileName.Text) 
            'CHOSE TRES ETONANATE ! si j'utilises cette méthode le fichier n'est pas supprimé
            'car il est encore utilisé par un autre processus
     
        End Sub
    bonjour,

    je ne sais pas si c'est bon d'ouvrir une discution qui était fermée de puits long temps!
    en utilisant ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            PictureBox_Apercu.Image.Dispose()
     
            PictureBox_Apercu.Image = Nothing  'je désaffiche l'image de la frame
     
            GC.Collect()   'c'est effectivement ce qui permet de liberer les ressources images
     
            Kill(TextBox_FileName.Text)  'effectivement le fichier est supprimé (tout en force...) oufffffffffffffffffffffffffffffff
    mais ça ne marche pas chez moi!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
                vuImage.Dispose()
                vuImage.Image = Nothing
     
    GC.Collect()
     
    Kill(Application.StartupPath & "\ressources\" & LSTGroupe.Text & "\" & LSTImages.Text)
    'My.Computer.FileSystem.DeleteFile(Application.StartupPath & "\ressources\" & LSTGroupe.Text & "\" & LSTImages.Text)
                'File.Delete(Application.StartupPath & "\ressources\" & LSTGroupe.Text & "\" & LSTImages.Text)
    toujours la réponse le fichier est utilisé
    visual basic 2005
    est ce que je peux trouvé une réponse?
    cordialement

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Alors la bravo , un déterrage de 6 ans sachant que le sujet était résolue ...
    Je croit que tu entre dans les records la

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment ouvrir un fichier qui est sur mon téléphone
    Par kryptikcreations dans le forum Android
    Réponses: 2
    Dernier message: 17/03/2014, 16h27
  2. Réponses: 7
    Dernier message: 17/04/2009, 16h54
  3. Réponses: 3
    Dernier message: 01/12/2006, 12h52
  4. Réponses: 4
    Dernier message: 19/07/2006, 12h29
  5. Comment supprimer des fichiers en nombre ?
    Par Didier L dans le forum API, COM et SDKs
    Réponses: 13
    Dernier message: 25/01/2005, 16h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo