2008-11-12 20 views
10

Estoy trabajando en una aplicación WPF que se abre y muestra documentos XPS. Cuando la aplicación se cierra, la especificación es que la aplicación debe eliminar el documento XPS abierto para su limpieza. Sin embargo, al abrir un determinado documento XPS, la aplicación arroja una excepción que indica que el archivo aún está en uso cuando intenta eliminarlo. Es un poco extraño porque solo ocurre cuando se abre un documento XPS en particular y solo cuando se ha movido más allá de la primera página.WPF DocumentViewer no lanza el archivo XPS

Algunos de los códigos I utilizados se muestran a continuación:

Para abrir el documento XPS:

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

para navegar por el documento XPS:

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

Para cerrar el objeto DocumentViewer y borrando el archivo:

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

Todo es bastante básico y funciona con los otros documentos que probamos. Pero con el documento XPS particular, aparece una excepción que dice que el archivo que se va a eliminar todavía se está utilizando.

¿Hay algún error o falta en mi código?

Gracias!

Respuesta

2

Hacer el XpsDocument un miembro, entonces no llame a close() en él :)

+0

¡Hola, funcionó! Acabo de dejar el objeto XpsDocument abierto y solo llamé a XpsDocument.Close() durante la salida y pude eliminar el archivo. Gracias moogs! –

+1

Esto funciona solo si puede cerrar su aplicación para liberar el bloqueo. Si necesita liberar el bloqueo mientras la aplicación permanece abierta, deberá ver mi respuesta a continuación o en http://stackoverflow.com/questions/1442607/how-do-i-get-wpfs-documentviewer-to-release-its -file-lock-on-the-source-xps-docu –

0

Gracias por la respuesta!

Es un poco bajo nivel pero lo tendré en cuenta cuando me queden sin ideas. De todos modos, descubrí un poco más sobre el error. El documento particular que causa la excepción tiene imágenes insertadas en ellos. Cuando elimino las imágenes, la excepción no ocurre. Esto podría ser un error de DocumentViewer tal vez, pero todavía estoy intentando ...

0

No, hasta ahora, nada.

Sólo para enumerar, he tratado de los siguientes métodos que fallaron:

  1. poner todo a cero en el caso de "cerrado" de la ventana antes de borrar el archivo. Esto incluye la propiedad DocumentViewer.Document y el objeto DocumentViewer.

  2. Se utilizó ShowDialog() para abrir la ventana y configurarla como nula después. Se movió la eliminación del archivo al evento "Salir" del objeto System.Windows.Application que está abriendo la ventana. Aún arroja la excepción de que el archivo está siendo utilizado.

DocumentViewer error ???

6

Debe cerrar System.IO.Packaging.Package desde el que se abrió el XpsDocument asignado al visor. Además, si desea poder volver a abrir el mismo archivo dentro de la misma sesión de la aplicación, deberá eliminar el Paquete de la Tienda de paquetes.

Trate

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í, ya sé que probablemente no abre la XpsDocument con un paquete y ni siquiera se puede saber lo que uno es - o cuidado - pero .NET hice "para" que detrás de la escenas y se olvida de limpiar después de sí mismo.

Cuestiones relacionadas