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 :

Pb suppression fichier verrouillé en VB NET [Débutant]


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2016
    Messages : 4
    Par défaut Pb suppression fichier verrouillé en VB NET
    Bonjour,

    voici mon code pour changer la version d'un fichier PDF avec iTextSharp :
    Try
    Using pdfReader As New PdfReader(tbModifVersionPDFOriginale.Text)
    ' Attention, on peut upgarder mais pas downgrader de version PDF !
    Using stamper = New PdfStamper(pdfReader, New FileStream(tbModifVersionPDFOriginale.Text & ".tmp.pdf", FileMode.Create), Mid(cbVersionPDF.Text, 3, 1))
    stamper.Close()
    stamper.Dispose()
    End Using
    pdfReader.Close()
    pdfReader.Dispose()
    End Using

    File.Delete(tbModifVersionPDFOriginale.Text)
    File.Move(tbModifVersionPDFOriginale.Text & ".tmp.pdf", tbModifVersionPDFOriginale.Text)
    lbVersionPDF.Text = "Version PDF : " & cbVersionPDF.Text
    Catch ex As Exception
    MessageBox.Show(ex.ToString)
    End Try

    Mais sur la ligne "File.Delete(tbModifVersionPDFOriginale.Text)", j'ai une erreur disant que "Le processus ne peut pas accéder au fichier '...pdf', car il est en cours d'utilisation par un autre processus".
    J'ai déjà essayé de changer l'ordre des "Close", de mettre "pdfcReader=Nothing" au lieu de "Using .. End Using".

    Je ne comprends pas car je pensai avoir bien fermer tous mes fichiers et libérer tous les flux par la fin de "Using"

    Merci à toute personne qui pourrait voir l'erreur de code que je ne vois pas.
    Cordialement.

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Par défaut
    Citation Envoyé par ILL20152000 Voir le message
    J'ai déjà essayé de changer l'ordre des "Close", de mettre "pdfcReader=Nothing" au lieu de "Using .. End Using".

    Je ne comprends pas car je pensai avoir bien fermer tous mes fichiers et libérer tous les flux par la fin de "Using"
    Je me trompe peut-être mais il se peut que le close ne fasse que libérer la mémoire et non stopper le processus. Si tu mets un point d'arrêt juste avant d'exécuter le File.Delete() et qui tu regardes dans le gestionnaire des tâches tu devrait voir s'il est toujours ouvert.

    Au passage,

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2016
    Messages : 4
    Par défaut
    Merci de votre réponse.

    Désolé mais dans le gestionnaire, je ne peux pas voir les fichiers ouverts - même dans la partie Gestion de l'ordinateur - Dossiers partagés - Fichiers ouvert, je ne le vois pas.
    En mode debug, je vois bien que c'est mon programme qui verrouille mon fichier.

    Désolé pour la balise, je vais y penser la prochaine fois.
    Je dois remplacer le code par quel code pour fermer le fichier "pdfReader" ?
    NB : chose bizarre, si je répète plusieurs fois avec une pause de 10 secondes dans ce cas, j'ai un autre problème :
    le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     File.Delete(tbModifVersionPDFOriginale.Text)
    supprime les 2 fichiers PDF comme s'il y avait un lien !!

  4. #4
    Membre Expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Par défaut
    Salut,

    pour savoir quel process lock un fichier tu peux utiliser ProcessExplorer (menu Find > Find handle et DLL ...).

    Sinon le seul truc que je vois de suite c'est que tu initialises un FileStream sans jamais le clore.
    Essaie de ressortir son initialisation et de caser l'objet dans une variable puis de faire un Close() dessus avant ton File.Delete().

  5. #5
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    Bonjour,

    Je ne connais pas PdfStamper mais peut-être faut-il libérer le FileStream aussi (c'est un IDisposable).

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2016
    Messages : 4
    Par défaut
    Merci pour ces pistes de recherche.
    Mais "FileStream" concerne le fichier de destination ?
    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
     
    Dim _fStream As New FileStream(tbModifVersionPDFOriginale.Text & ".tmp.pdf", FileMode.Create)
     
            Try
                Using pdfReader As New PdfReader(tbModifVersionPDFOriginale.Text)
                    ' Attention, on peut upgarder mais pas downgrader de version PDF !
                    Using stamper = New PdfStamper(pdfReader, _fStream, Mid(cbVersionPDF.Text, 3, 1))
                        stamper.Close()
                        stamper.Dispose()
                    End Using
                    pdfReader.Close()
                    pdfReader.Dispose()
                End Using
                _fStream.Close()
                _fStream.Dispose()
                File.Delete(tbModifVersionPDFOriginale.Text)
                File.Move(tbModifVersionPDFOriginale.Text & ".tmp.pdf", tbModifVersionPDFOriginale.Text)
                lbVersionPDF.Text = "Version PDF : " & cbVersionPDF.Text
            Catch ex As Exception
                MessageBox.Show(ex.ToString)
            End Try
    Avec un close et un dispose sur le FileStream, ce n'est pas mieux.

    La solution que j'ai trouvée, mais qui n'est pas élégant :
    - dépasser le fichier d'origine dans un dossier temporaire
    - faire mon traitement sur ce fichier temporaire vers le chemin et nom d'origine
    - à la fermeture de mon programme, supprimer tous les fichiers du dossier temporaire.

    Mais j'aimerai quand même bien comprendre pourquoi le fichier reste ouvert ??

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2016
    Messages : 4
    Par défaut
    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
     
    Private Sub fModifVersionPDf()
            If CInt(Mid(lbVersionPDF.Text, Len(lbVersionPDF.Text), 1)) = CInt(Mid(cbVersionPDF.Text, 3, 1)) Then
                MessageBox.Show("Attention c'est la même version !")
                Exit Sub
            End If
            If CInt(Mid(lbVersionPDF.Text, Len(lbVersionPDF.Text), 1)) > CInt(Mid(cbVersionPDF.Text, 3, 1)) Then
                MessageBox.Show("Désolé, je ne peux pas mettre ce fichier PDF dans une version plus ancienne !")
                Exit Sub
            End If
     
            Try
                Using _fStream As New FileStream(tbModifVersionPDFOriginale.Text & ".tmp.pdf", FileMode.Create)
                    Using pdfReader As New PdfReader(tbModifVersionPDFOriginale.Text)
                        ' Attention, on peut upgrader mais pas downgrader de version PDF !
                        Using stamper = New PdfStamper(pdfReader, _fStream, Mid(cbVersionPDF.Text, 3, 1))
                            stamper.Close()
                        End Using
                        _fStream.Close()
                        pdfReader.Close()
                    End Using
                End Using
                GC.Collect()
                Thread.Sleep(1000)
                File.Delete(tbModifVersionPDFOriginale.Text)
                File.Move(tbModifVersionPDFOriginale.Text & ".tmp.pdf", tbModifVersionPDFOriginale.Text)
                lbVersionPDF.Text = "Version PDF : " & cbVersionPDF.Text
                MessageBox.Show("Le traitement a bien été réalisé.")
            Catch ex As Exception
                MessageBox.Show(ex.ToString & vbCrLf & vbCrLf & "CELA VA RELANCER LE TRAITEMENT.")
                Call fModifVersionPDf()
            End Try
        End Sub
    voici mon code (il faut valider une fois le message d'erreur et rappeler ma fonction, ensuite le traitement marche ?? - et même sans message d'erreur si l'on fait encore une modification sur le même fichier), c'est moins laid que mon ancienne solution.
    va savoir pourquoi !
    Je clore cette discussion.
    Merci aux personnes qui ont essayées de m'apporter leurs aides.

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

Discussions similaires

  1. suppression fichier avec erreur
    Par zeus312 dans le forum C
    Réponses: 5
    Dernier message: 23/02/2006, 11h24
  2. Envoyer un fichier lourd sur le net
    Par Bouassa dans le forum Autres Logiciels
    Réponses: 6
    Dernier message: 10/02/2006, 12h25
  3. Suppression fichier
    Par lili_bzh dans le forum Linux
    Réponses: 13
    Dernier message: 08/02/2006, 12h39
  4. [VB NET 2005] Suppression Fichier
    Par metallicox dans le forum Windows Forms
    Réponses: 6
    Dernier message: 23/11/2005, 15h11
  5. [C#] [FTP] Envoi et suppression fichier sur ftp NON ANONYME!
    Par djsbens dans le forum Windows Forms
    Réponses: 14
    Dernier message: 30/03/2005, 10h20

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