WPF DocumentViewer не выпускает файл XPS

Я работаю над приложением WPF, которое открывает и отображает документы XPS. Когда приложение закрывается, спецификация заключается в том, что приложение должно удалить открытый документ XPS для очистки. Однако, при открытии определенного документа XPS, приложение выдает исключение, что файл все еще используется при попытке удалить его. Это немного странно, потому что это происходит только при открытии определенного документа XPS и только когда вы перешли за пределы первой страницы.

некоторые из кодов, которые я использовал, показаны ниже:

для открытия документа XPS:

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

для навигации по документу XPS:

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

для закрытия объекта DocumentViewer и удаления файла:

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

все довольно просто и он работает с другими документами, которые мы тестировали. Но с конкретным документом XPS появляется исключение, говорящее, что файл, который нужно удалить, все еще используется.

Is что-то не так или отсутствует в моем коде?

спасибо!

6 ответов


сделайте xpsDocument членом, а затем не вызывайте close () на нем:)


вам нужно закрыть систему.ИО.Упаковка.Пакет, из которого был открыт XpsDocument, назначенный средству просмотра. Кроме того, если вы хотите снова открыть тот же файл в том же сеансе приложения, вам придется удалить пакет из PackageStore.

попробовать

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

Да, я знаю, что вы, вероятно, не открывали XpsDocument с пакетом и, возможно, даже не знаете, что такое - или забота-но .NET сделал это" для " вас за кулисами и забывает убирать за собой.


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

вы можете выяснить, кто держит ручку и неуправляемый стек, используя WinDbg

EDIT: и, конечно, вы также можете получить управляемую трассировку стека и ковыряться через расширение SOS (http://msdn.microsoft.com/en-us/library/bb190764.aspx)


Спасибо за ответ!

Это немного низкоуровневый, но я буду иметь это в виду, когда у меня закончатся идеи. Так или иначе, я узнал немного больше о жучке. В конкретный документ, который вызывает исключение, вставлены изображения. Когда я удаляю изображения, исключения не происходит. Возможно, это ошибка DocumentViewer, но я все еще пытаюсь...


нет, пока еще ничего.

просто перечислить, я пробовал следующие методы, которые провалились:

  1. установите все значение null в событии "закрыто" окна перед удалением файла. Это включает DocumentViewer.Свойство Document и объект DocumentViewer.

  2. используется ShowDialog (), чтобы открыть окно и установить его в значение null. Переместил удаление файла в событие" Exit" Система.Окна.Объект приложения, открывающий окно. По-прежнему выдает исключение, что файл используется.

ошибка DocumentViewer???


Я подозреваю, что вы столкнулись с той же проблемой, как http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework/topic59281.aspx

звучит как ошибка в DocumentViewer, он должен был удалить вложенные BitmapDecoders при закрытии или загрузить изображение с другой опцией кэширования растровых изображений.