2008-11-12 12 views
10

Sto lavorando a un'applicazione WPF che apre e visualizza i documenti XPS. Quando l'applicazione si chiude, la specifica è che l'applicazione dovrebbe eliminare il documento XPS aperto per la pulizia. Tuttavia, quando si apre un determinato documento XPS, l'applicazione genera un'eccezione che il file è ancora in uso quando tenta di eliminarlo. È un po 'strano perché accade solo quando si apre un particolare documento XPS e solo quando si è passati oltre la prima pagina.DocumentViewer WPF non rilascia il file XPS

Alcuni dei codici che ho usato sono mostrati di seguito:

Per aprire il documento XPS:

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

Per muovere il documento XPS:

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

Per chiudere l'oggetto DocumentViewer e cancellazione del file:

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

È tutto piuttosto semplice e funziona con gli altri documenti che abbiamo testato. Ma con il particolare documento XPS, si apre un'eccezione che dice che il file da eliminare è ancora in uso.

C'è qualcosa di sbagliato o mancante nel mio codice?

Grazie!

risposta

2

Fai il XpsDocument un membro, quindi non chiamare close() su di esso :)

+0

Ehi, questo ha funzionato! Ho appena lasciato aperto l'oggetto XpsDocument e ho chiamato XpsDocument.Close() solo durante l'uscita e sono stato in grado di eliminare il file. Grazie moog! –

+1

Funziona solo se è possibile chiudere l'applicazione per sbloccare il blocco. Se è necessario il blocco rilasciato mentre l'applicazione rimane aperta, è necessario consultare la mia risposta qui sotto o su http://stackoverflow.com/questions/1442607/how-do-i-get-wpfs-documentviewer-to-release-its -file-lock-on-the-source-xps-docu –

0

Grazie per la risposta!

È un po 'di basso livello ma lo terrò a mente quando mancherò le idee. Comunque, ho scoperto un po 'di più sul bug. Il particolare documento che causa l'eccezione contiene immagini inserite in esse. Quando rimuovo le immagini, l'eccezione non si verifica. Questo potrebbe essere un errore DocumentViewer forse, ma sto ancora cercando ...

0

No, finora ancora nulla.

Solo per enumerare, ho provato i seguenti metodi che non sono riusciti:

  1. impostare tutto al nulla in caso "chiuso" della finestra prima di eliminare il file. Questo include la proprietà DocumentViewer.Document e l'oggetto DocumentViewer.

  2. Utilizzato ShowDialog() per aprire la finestra e impostarlo su null successivamente. Sposta la cancellazione del file all'evento "Exit" dell'oggetto System.Windows.Application che sta aprendo la finestra. Ancora lancia l'eccezione che il file è in uso.

Bug DocumentViewer ???

6

È necessario chiudere il System.IO.Packaging.Package da cui è stato aperto XpsDocument assegnato al visualizzatore. Inoltre, se si desidera essere in grado di aprire nuovamente lo stesso file all'interno della stessa sessione dell'applicazione, sarà necessario rimuovere il pacchetto dal PackageStore.

Prova

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); 

Sì, lo so che probabilmente non apre il XpsDocument con un pacchetto e potrebbe anche non sapere ciò che si è - o cura - ma .NET fatto "per" voi dietro la scene e dimentica di ripulire se stesso.

Problemi correlati