Pergunta

Eu estou trabalhando em um aplicativo WPF que abre e exibe documentos XPS. Quando os fecha de aplicação, a especificação é o aplicativo deve excluir o documento XPS aberto para limpeza. No entanto, ao abrir um determinado documento XPS, o aplicativo gera uma exceção que o arquivo ainda está em uso quando ele tenta excluí-lo. É um pouco estranho, porque isso só acontece quando abre um documento XPS particular e somente quando você se moveu além da primeira página.

Alguns dos códigos que eu usei são mostrados abaixo:

Para abrir o 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 no documento XPS:

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

Para fechar o objeto DocumentViewer e excluir o arquivo:

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

É tudo bastante básico e funciona com os outros documentos que testamos. Mas com o documento XPS particular, uma exceção aparece dizendo que o arquivo a ser excluído ainda está sendo usado.

Existe errado algo ou em falta do meu código?

Obrigado!

Foi útil?

Solução

Faça o XpsDocument um membro, então não chamar close () sobre ele:)

Outras dicas

Você precisa fechar o System.IO.Packaging.Package partir do qual o XpsDocument designado para o espectador foi aberto. Além disso, se você quer ser capaz de abrir o mesmo arquivo novamente na mesma sessão aplicativo, você terá que remover o pacote do PackageStore.

Tente

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

Sim, eu sei que você provavelmente não abrir o XpsDocument com um pacote e pode até não saber o que é - ou cuidados - mas .NET fez isso "para" você nos bastidores e se esquece de limpar depois de si mesmo.

http : //blogs.msdn.com/junfeng/archive/2008/04/21/use-htrace-to-debug-handle-leak.aspx

Você pode descobrir quem detém o punho ea pilha não gerenciada usando WinDbg

EDIT: E, claro, você também pode obter o rastreamento de pilha gerenciada e bisbilhotar através da extensão SOS ( http://msdn.microsoft.com/en-us/library/bb190764.aspx )

Obrigado pela resposta!

É um pouco de baixo nível, mas eu vou manter isso em mente quando eu ficar sem ideias. De qualquer forma, eu descobri um pouco mais sobre o bug. O documento especial que faz com que a exceção têm imagens inserido neles. Quando eu remover as imagens, a exceção não acontece. Este poderia ser um bug DocumentViewer talvez, mas eu ainda estou tentando ...

Não, até agora ainda nada.

Apenas para enumerar, eu tentei os seguintes métodos que falhou:

  1. Set tudo para nulo no evento "fechado" da janela antes de excluir o arquivo. Isto inclui a propriedade DocumentViewer.Document eo objeto DocumentViewer.

  2. Usado ShowDialog () para abrir a janela e defini-lo como nulo depois. Movido a exclusão do arquivo para o "Exit" evento do objeto System.Windows.Application que está abrindo a janela. Ainda lança a exceção de que o arquivo está sendo usado.

DocumentViewer bug ???

Eu suspeito que você está correndo para o mesmo problema que http://www.devnewsgroups.net/group/microsoft. public.dotnet.framework / topic59281.aspx

Sons como um erro no DocumentViewer deveria ter dispostas de BitmapDecoders aninhados no próximo ou carregados a imagem com uma opção de cache de bitmap diferente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top