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 :

« Le processus ne peut pas accéder au fichier "Document.xps" » DocumentViewer


Sujet :

VB.NET

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 106
    Points : 67
    Points
    67
    Par défaut « Le processus ne peut pas accéder au fichier "Document.xps" » DocumentViewer
    Boujour à tous,

    Lorsque j'ouvre un document xps avec un DocumentViewer,
    le fichier devient bloqué et impossible à supprimer car il est utilisé par un autre processus.

    Voici le code que j'utilise pour ouvrir un fichier XPS:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim Folder as String
    Dim doc As New XpsDocument(Folder & "Document.xps", IO.FileAccess.Read)
    'Ici je récupère le FixedDocument pour utilisation ultérieur
    Dim docReference As DocumentReference = doc.GetFixedDocumentSequence().References.First
    DocumentViewer1.Document = docReference.GetDocument(False)
    Quelqu'un aurait-il une idée pour libérer le processus?

    Merci d'avance,
    Éric

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    A priori il faut fermer le document en appelant Dispose dessus

    Sinon, l'autre possibilité est d'ouvrir manuellement un Stream et de le fermer quand tu as chargé le document. Un truc comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim doc As XpsDocument
    Using s As Stream = File.OpenRead(Folder & "Document.xps")
        Using p As Package = Package.Open(s)
            doc = new XpsDocument(p)
        End Using
    End Using
    (pas testé)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 106
    Points : 67
    Points
    67
    Par défaut
    Salut et merci TomLev pour ta réponse.

    J'ai essayé ton code, qui semble être une très bonne piste,
    sauf que je reçois une erreur lorsque je change le DocumentViewer1.Document :
    L'URI de XpsDocument a la valeur null. Utilisez le constructeur de XpsDocument qui accepte le paramètre URI.
    On dirait que le DocumentViewer a besoin absolument d'une URI pour pouvoir fonctionner..

    Auriez-vous un idée comment contourner cela?

    P-S: Je ne suis pas sûre de comprendre où il faut faire le Dispose, car sur les variables, il n'y a pas de fonction .Dispose()

    Merci

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Eric_M Voir le message
    Auriez-vous un idée comment contourner cela?
    Absolument pas... j'ai jamais utilisé ça, j'ai juste regardé dans la doc

    Citation Envoyé par Eric_M Voir le message
    P-S: Je ne suis pas sûre de comprendre où il faut faire le Dispose, car sur les variables, il n'y a pas de fonction .Dispose()
    Sur le Stream, il y a bien une méthode Dispose. Sur le Package, elle existe mais elle est "cachée" par implémentation explicite de l'interface IDisposable. C'est à dire qu'elle n'est accessible que quand on manipule l'objet via l'interface IDisposable. Mais l'instruction Using gère ça proprement, donc pas besoin de s'en préoccuper

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 106
    Points : 67
    Points
    67
    Par défaut
    Ok, j'ai trouvé la solution!

    En testant ton code, j'obtenais des erreurs différentes et,
    après plusieurs recherches, j'ai réussi à en venir à un code qui fonctionne.

    Le voici:
    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
       Dim TempPathOfXPS As String
        Dim packageUri As New Uri("memorystream:/Document.xps")
        Dim xpsStream As Stream
        Dim package__1 As Package
        Dim xpsDoc As XpsDocument
     
        Private Sub LoadXPSDoc(ByVal FilePath As String)
            TempPathOfXPS = FilePath
     
            xpsStream = File.OpenRead(FilePath)
            package__1 = Package.Open(xpsStream, FileMode.Open, FileAccess.Read)
     
     
            'Add package to PackageStore
            PackageStore.AddPackage(packageUri, package__1)
     
            xpsDoc = New XpsDocument(package__1, CompressionOption.SuperFast, packageUri.ToString)
     
            Dim docReference As DocumentReference = xpsDoc.GetFixedDocumentSequence().References.First
            DocumentViewer1.Document = docReference.GetDocument(False)
     
     
            ' PackageStore.RemovePackage(packageUri)
     
        End Sub
    Et, dans un Timer, après un délai (pour laisser le temps au DocumentViewer d'ouvrir complètement le document),
    j'effectue ce code pour nettoyer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        If TempPathOfXPS <> "" Then
     
                xpsDoc.Close()
                PackageStore.RemovePackage(packageUri)
                package__1.Close()
                xpsStream.Close()
                Try
                    IO.Directory.Delete(TempPathOfXPS.Substring(0, TempPathOfXPS.LastIndexOf("\")), True)
                Catch ex As Exception
                End Try
     
                TempPathOfXPS = ""
            End If
    Avec ce code, je peux libérer le fichier xps lorsqu'il a été créer avec mon code

    Le seul problème, c'est que si il ne l'est pas (ex.: Convertion DOC -> XPS) et que je le libère, je ne pourrai plus sauvegarder le FixedDocument du DocumentViewer et j'obtient l'erreur suivante:
    Impossible d'effectuer une opération de lecture avec un mode en écriture seule.
    Je ne suis pas sûr, mais je croix que ça ne fonctionne pas avec les autres car ils contiennent des images et qu'il y a un problème avec le lecteur de Bitmap du DocumentViewer..

Discussions similaires

  1. Réponses: 18
    Dernier message: 28/10/2009, 23h17
  2. Réponses: 22
    Dernier message: 02/10/2009, 10h31
  3. Réponses: 7
    Dernier message: 22/08/2008, 16h20
  4. Réponses: 5
    Dernier message: 26/06/2008, 12h28
  5. Erreur : Le processus ne peut pas accéder au fichier
    Par victor72 dans le forum Dev-C++
    Réponses: 1
    Dernier message: 16/03/2007, 14h50

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