2008-11-12 6 views
10

Je travaille sur une application WPF qui ouvre et affiche des documents XPS. Lorsque l'application se ferme, la spécification est l'application doit supprimer le document XPS ouvert pour le nettoyage. Toutefois, lors de l'ouverture d'un certain document XPS, l'application lève une exception: le fichier est toujours utilisé lorsqu'il tente de le supprimer. C'est un peu bizarre, car cela ne se produit que lors de l'ouverture d'un document XPS particulier et seulement lorsque vous avez dépassé la première page.WPF DocumentViewer ne libère pas le fichier XPS

Certains codes I utilisés sont indiqués ci-dessous:

Pour ouvrir le XPS Document:

DocumentViewer m_documentViewer = new DocumentViewer(); 
XpsDocument m_xpsDocument = new XpsDocument(xpsfilename, fileaccess); 
m_documentViewer.Document = m_xpsDocument.GetFixedDocumentSequence(); 
m_xpsDocument.Close(); 

Pour naviguer dans le document XPS:

m_documentViewer.FirstPage(); 
m_documentViewer.LastPage(); 
m_documentViewer.PreviousPage(); 
m_documentViewer.NextPage(); 

Pour fermer l'objet DocumentViewer et la suppression du fichier:

m_documentViewer.Document = null; 
m_documentViewer = null; 
File.Delete(xpsfilename); 

Tout est assez basique et fonctionne avec les autres documents que nous avons testés. Mais avec le document XPS particulier, une exception apparaît, indiquant que le fichier à supprimer est toujours utilisé.

Y at-il quelque chose de mal ou manquant de mon code?

Merci!

Répondre

2

Faire le XpsDocument un membre, puis faire sur elle :)

+0

Hey celui-ci a fonctionné! Je viens de laisser l'objet XpsDocument ouvert et seulement appelé XpsDocument.Close() pendant la sortie et j'ai été capable de supprimer le fichier. Merci les moogs! –

+1

Cela ne fonctionne que si vous pouvez fermer votre application pour libérer le verrou. Si vous avez besoin du verrou libéré pendant que votre application reste ouverte, vous devrez voir ma réponse ci-dessous ou sur http://stackoverflow.com/questions/1442607/how-do-i-get-wpfs-documentviewer-to-release-its -file-lock-on-the-source-xps-docu –

0

Merci pour la réponse!

Il est un peu plus bas niveau mais je vais le garder à l'esprit quand je court d'idées. De toute façon, j'ai découvert un peu plus sur le bug. Le document particulier qui provoque l'exception contient des images. Lorsque je supprime les images, l'exception ne se produit pas. Cela pourrait être un bug DocumentViewer peut-être, mais je suis encore à essayer ...

0

Nope, jusqu'à présent toujours rien.

Juste Enumérer, j'ai essayé les méthodes suivantes qui ont échoué:

  1. tout Réglé sur null en cas « fermé » de la fenêtre avant de supprimer le fichier. Cela inclut la propriété DocumentViewer.Document et l'objet DocumentViewer.

  2. Utilisé ShowDialog() pour ouvrir la fenêtre et la définir à null par la suite. Déplacement de la suppression du fichier dans l'événement "Exit" de l'objet System.Windows.Application qui ouvre la fenêtre. Lève toujours l'exception que le fichier est utilisé.

DocumentViewer bug ???

6

Vous devez fermer le System.IO.Packaging.Package à partir duquel le XpsDocument affecté au visualiseur a été ouvert. En outre, si vous souhaitez pouvoir ouvrir à nouveau le même fichier dans la même session d'application, vous devrez supprimer le package du PackageStore.

Essayez

var myXpsFile = @"c:\path\to\My XPS File.xps"; 
var myXpsDocument = new XpsDocument(myXpsFile); 
MyDocumentViewer.Document = myXpsDocument; 

//open MyDocumentViwer's Window and then close it 
//NOTE: at this point your DocumentViewer still has a lock on your XPS file 
//even if you Close() it 
//but we need to do something else instead 

//Get the Uri from which the system opened the XpsPackage and so your XpsDocument 
var myXpsUri = myXpsDocument.Uri; //should point to the same file as myXpsFile 

//Get the XpsPackage itself 
var theXpsPackage = System.IO.Packaging.PackageStore.GetPackage(myXpsUri); 

//THIS IS THE KEY!!!! close it and make it let go of it's file locks 
theXpsPackage.Close(); 

File.Delete(myXpsFile); //this should work now 

//if you don't remove the package from the PackageStore, you won't be able to 
//re-open the same file again later (due to System.IO.Packaging's Package store/caching 
//rather than because of any file locks) 
System.IO.Packaging.PackageStore.RemovePackage(myXpsUri); 

Oui, je sais que vous avez probablement ne pas ouvrir le XpsDocument avec un package et savez peut-être même pas ce que l'on est - ou les soins - mais .NET l'ai fait « pour » vous derrière la scènes et oublie de nettoyer après lui-même.

Questions connexes