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

VB.NET Discussion :

probleme avec IO.File.Delete


Sujet :

VB.NET

  1. #1
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2011
    Messages
    453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 453
    Par défaut probleme avec IO.File.Delete
    Bonjour tout le monde,

    J'ai une application qui génère un pdf et un bouton "Apercu" qui ouvre une fenêtre contenant un webBrowser qui affiche le pdf.
    Cependant vu que ce n'est qu'une fenêtre d'aperçu, je voudrais faire un delete du pdf quand cette fenêtre est fermée mais je ne peux pas car j'ai une erreur me disant que le document est déjà en cours d'utilisation (j'imagine que c'est le webBrowser qui provoque ça).

    Pourtant lorsque je ferme ma fenêtre d'aperçu le pdf devrait être "libéré"...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If generationPDF() Then                                                                      'generationPDF renvoi True si succés
                    FenetreApercu.AffichageApercu("C:\Users\stagiaire-info2\Desktop\FT_IDTracteur_Code.pdf") 'instanciation de ma fenêtre avec le chemin du pdf
                    FenetreApercu.ShowDialog()                                                               'fenêtre modale
                    IO.File.Delete("C:\Users\stagiaire-info2\Desktop\FT_IDTracteur_Code.pdf")                'delete du pdf "temporaire"
                End If
    Petite précision : j'arrive bien à delete ce pdf mais à partir d'un autre bouton

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub ButtonSupprimerFiche_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonSupprimerFiche.Click
            MsgBox("Etes vous sûr de vouloir supprimer cette fiche ?" + vbCrLf + "Toutes suppression est définitive.", MsgBoxStyle.OkCancel, "Suppression d'une fiche")
            If MsgBoxResult.Ok Then
                IO.File.Delete("C:\Users\stagiaire-info2\Desktop\FT_IDTracteur_Code.pdf")
                DGVListeFiche.Rows.Remove(DGVListeFiche.SelectedRows.Item(0))
            End If
        End Sub

  2. #2
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Salut l'ami ^^

    Et oui encore moi :-)

    Voilà, à mon humble avis, ce qu'il se passe (tout le code n'étant pas posté, je fais des suppositions) :
    - La sub de ton bouton d'aperçu crée une instance de la winform qui contient le webbrowser. Vu que le webform est un enfant du winform, il est créé en même temps (heureusement ^^)
    - Ton showdialog affiche l'aperçu et attend la fermeture de la fenêtre pour poursuivre le traitement.
    - Tu essaies de faire un delete mais vu que tu ne détruis pas l'instance de ta fenêtre de manière explicite, le webbrowser n'est pas détruit et donc le fichier est toujours utilisé
    - Lorsque tu cliques sur l'autre bouton, tu changes de procédure. Ce qui fait que tout ce qui est déclaré localement "cesse d'exister". Cela inclut ta fenêtre d'aperçu et par conséquent, le webbrowser qui s'y trouve. Cela libère donc le fichier pdf afficher dans le webbrowser.

    Ma suggestion (en se basant que mes suppositions sont justes car je n'ai jamais vraiment lu de doc sur "Comment VS instancie les fenêtres") :

    Après ton showdialog, je placerai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    FenetreApercu.Dispose()
    FenêtreApercu = Nothing
    Peux-tu essayer cela ?

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2011
    Messages
    453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 453
    Par défaut
    Merci de te pencher (une nouvelle fois ^^) sur mon problème

    Donc je viens de tester ce que tu viens de dire (pour info je l'avais déjà tester mais sans le "fenetreApercu = Nothing") et il n'y a aucun changement


  4. #4
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Fichtre !

    Mais quelque chose me chipote... Ce delete ne faisait-il pas l'objet d'une précédente discussion dont la chose avait été résolue justement en mettant le webbrowser dans une fenêtre à part ?

    Sinon, p-e qu'il faut un certain temps au Garbage Collector pour faire son job...
    Essaie alors en libérant directement le webbrowser plutôt que la fenetreApercu.

    J'attends ton feedback ;-)

  5. #5
    Membre émérite
    Avatar de Gurdil le nain
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2009
    Messages
    468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 468
    Par défaut
    Bonjour,

    Peux tu nous montrer le code de ta méthode afficheApercu s'il te plait ?
    Tu as peut être oublié de fermer l'objet lisant ton pdf

  6. #6
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2011
    Messages
    453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 453
    Par défaut
    @griftou : effectivement nous en avions déjà discuté et j'avais résolu le problème en mettant ce webBrowser dans une autre fenêtre, mais le problème est réapparue puisque je veux supprimer ce pdf qui n'est qu'un paerçu et ne le garder que si le user clic sur "Enregistrer"...

    @Gurdil : merci de te joindre à nous pour tenter de venir à bout de ma nOOb attitude , sinon pour répondre à ta question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Public Class FenetreApercu
     
        Public Sub AffichageApercu(ByVal chemin As String)
            WebBrowserApercu.Navigate(chemin)
        End Sub
     
    End Class

  7. #7
    Membre émérite
    Avatar de Gurdil le nain
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2009
    Messages
    468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 468
    Par défaut
    Y a t-il un endroit où tu fermes ton webbrowser ?

    Logiquement il devrait se fermer à la destruction de ta form...mais on sait jamais

  8. #8
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Citation Envoyé par Gurdil le nain Voir le message
    Y a t-il un endroit où tu fermes ton webbrowser ?

    Logiquement il devrait se fermer à la destruction de ta form...mais on sait jamais
    Citation Envoyé par griftou Voir le message

    Sinon, p-e qu'il faut un certain temps au Garbage Collector pour faire son job...
    Essaie alors en libérant directement le webbrowser plutôt que la fenetreApercu.

    J'attends ton feedback ;-)

  9. #9
    Membre émérite
    Avatar de Gurdil le nain
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2009
    Messages
    468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 468
    Par défaut
    Oups , j'avais pas vu ton message !

  10. #10
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2011
    Messages
    453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 453
    Par défaut
    J'ai essayé avec ces deux solutions là mais toujours le même résultat...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub FenetreApercu_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
            ' WebBrowserApercu.Navigate("")
            WebBrowserApercu.Dispose()
        End Sub

  11. #11
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    T'as essayé en ajoutant après le dispose un "WebBrowserApercu = Nothing" ?

    [Anecdote]
    Lors du développement pour mon usage personnel d'un outil modifiant aléatoirement l'arrière plan de mon bureau (oui je sais, win7 le fait déjà mais j'suis toujours XP^^), j'ai constaté que mon application prenait de plus en plus de ressources. En fait, les images que j'affichais successivement n'étaient jamais libérées.

    J'ai donc ajouté le un dispose pour chaque objet dont je faisais un new mais rien n'y faisait. J'ai alors testé par instinct en ajoutant après le dispose une ligne assignant nothing à l'objet en question hop, problème résolu.
    [/Anecdote]

  12. #12
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2011
    Messages
    453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 453
    Par défaut
    tester le =Nothing et rien de nouveau sous le soleil...

    je commence vraiment à desespérer avec ce webBrowser, ça me paraît quand même hallucinant que Microsoft n'ai pas prévu de .Clear() ou .Close() ou un truc dans ce genre là avec son webBrowser à la c** !!!

  13. #13
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Citation Envoyé par Shadam Voir le message
    @griftou : effectivement nous en avions déjà discuté et j'avais résolu le problème en mettant ce webBrowser dans une autre fenêtre, mais le problème est réapparue puisque je veux supprimer ce pdf qui n'est qu'un paerçu et ne le garder que si le user clic sur "Enregistrer"...
    Oui mais la première fois qu'on avait discuté de cela, c'était pour faire un delete non ? (ou un rename mais cela revient au même)

    Et tu avait l'air de dire que cela fonctionnait. Qu'est-ce qui a changé depuis ?

    EDIT : Sinon, d'après cette discussion (http://social.msdn.microsoft.com/For...a-c5e6d3c1b1bf), il semblerait qu'il te faut faire une copie du pdf a visualiser et d'afficher la-dite copie. Mais cela me semble bancale car tu resteras toujours avec ta copie sur les bras '-_-

  14. #14
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2011
    Messages
    453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 453
    Par défaut
    Si j'ai bien compris le lien que tu m'as donné, il faut faire une copy de l'original pour pouvoir le delete, stocker le chemin de la copy dans une variable pour pouvoir supprimer la-dite copy (lors de la fermeture de ton apply par exemple)

    Le problème c'est que chez moi quand tu cliques sur "Aperçu", tu génères le pdf donc je n'ai pas d'original à copier...

  15. #15
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Je me disais aussi que ça n'allait pas coller ;-).

    Enfin sinon, depuis la dernière fois, j'ai "réparé" mon problème qui faisait que je ne pouvais pas afficher de pdf dans un webbrowser. Du coup, j'suis en train de tester dans tous les sens...

    J'y arriverai !! ^^

  16. #16
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    J'ignore pourquoi je n'y ai pas pensé plus tôt mais j'y suis arrivé.

    Pour les tests, j'ai créé un projet windows application. Sur la form1 créée par défaut, j'ai mis un webbrowser et 2 boutons.

    Le premier bouton affiche un pdf. Et le second le supprime.

    Voici le code complet (en rouge les parties importantes) :
    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
    Public Class Form1
        Dim path As String = "C:\Documents and Settings\geoffroy.INNO\Desktop\test.pdf"
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            wb.Navigate(path)
        End Sub
    
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            wb.Navigate("")
            Dim th As New System.Threading.Thread(AddressOf fileDel)
            th.Start()
        End Sub
    
        Private Sub fileDel()
            While IO.File.Exists(path)
                Try
                    IO.File.Delete(path)
                Catch ex As Exception
                End Try
            End While
        End Sub
    End Class
    En fait, il faut apparemment un certain laps de temps à VB (entre 0,5s et 1s) pour libérer le fichier. Ce laps de temps étant plus long que celui nécessaire pour arriver à l'instruction delete, ça plante.

    Du coup, j'ai fait une boucle qui tente de supprimer le fichier tant qu'il existe. Evidemment, si ça met trop longtemps, ça ralentit l'application et l'utilisateur ne sera pas content. Du coup, je l'ai mise dans un thread séparé. Et hop, le tour est joué.

    Si tu as des questions, n'hésite pas

    EDIT : Il est important ici de naviguer vers autre chose sans quoi le document ne sera jamais libérer. Je n'ai pas tester en mettant le webbrowser dans une autre fenêtre mais un navigate("") à la fermeture de ta fenetreapercu ne te coutera rien

  17. #17
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2011
    Messages
    453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 453
    Par défaut
    ça marche du tonerre

    Je me doutais bien que c'était un truc dans ce genre là
    En fait, il faut apparemment un certain laps de temps à VB (entre 0,5s et 1s) pour libérer le fichier. Ce laps de temps étant plus long que celui nécessaire pour arriver à l'instruction delete, ça plante.
    En tout cas merci pour tout tu m'ôtes une belle épine du pied

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

Discussions similaires

  1. Probleme avec JFileChooser, file NULL
    Par mugwump dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 08/08/2007, 15h06
  2. [TableAdapter] probleme avec la methode DELETE
    Par drayif dans le forum Accès aux données
    Réponses: 7
    Dernier message: 05/07/2007, 14h46
  3. Probleme avec ma requete DELETE
    Par Subkill dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 25/05/2007, 19h14
  4. probleme avec la méthode "delete", (ADO)
    Par nguhv dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 04/04/2007, 13h56
  5. Probleme avec utl-file
    Par Scratch48 dans le forum Oracle
    Réponses: 25
    Dernier message: 12/04/2005, 18h39

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