2008-11-12 19 views
10

Pracuję nad aplikacją WPF, która otwiera i wyświetla dokumenty XPS. Po zamknięciu aplikacji specyfikacja jest aplikacją, która powinna usunąć otwarty dokument XPS w celu oczyszczenia. Jednak podczas otwierania określonego dokumentu XPS aplikacja zgłasza wyjątek, że plik jest nadal używany, gdy próbuje go usunąć. Jest to trochę dziwne, ponieważ dzieje się tak tylko podczas otwierania konkretnego dokumentu XPS i tylko wtedy, gdy przeniosłeś się poza pierwszą stronę.Program Document Viewer WPF nie zwalnia pliku XPS

Niektóre kody które stosowane są przedstawione poniżej:

celu otwarcia XPS dokument:

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

Do poruszania dokument XPS:

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

Do zamykania obiektów DocumentViewer i usunięcie pliku:

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

Wszystko to jest dość proste i działa z innymi testowanymi przez nas dokumentami. Ale w przypadku konkretnego dokumentu XPS pojawia się wyjątek, że plik, który ma zostać usunięty, wciąż jest używany.

Czy coś jest nie tak lub brakuje mi kodu?

Dzięki!

Odpowiedz

2

Dokonać xpsDocument członkiem, to nie nazywaj close() na nim :)

+0

Hej, ten działał! Właśnie opuściłem obiekt XpsDocument otwarty i tylko wywoływany XpsDocument.Close() podczas wyjścia i byłem w stanie usunąć plik. Dzięki moogs! –

+1

Działa to tylko wtedy, gdy możesz zamknąć aplikację, aby zwolnić blokadę. Jeśli potrzebujesz blokady zwolnionej, gdy twoja aplikacja pozostaje otwarta, musisz zobaczyć moją odpowiedź poniżej lub w http://stackoverflow.com/questions/1442607/how-do-i-get-wpfs-documentviewer-to-release-its -file-lock-on-the-source-xps-docu –

0

Dzięki za odpowiedź!

To trochę na niskim poziomie, ale będę o tym pamiętać, gdy zabraknie pomysłów. W każdym razie dowiedziałem się trochę więcej o błędzie. Szczególny dokument, który powoduje wyjątek, ma wstawione w nim obrazy. Kiedy usuwam obrazy, wyjątek się nie dzieje. Może to być błąd przeglądarki DocumentViewer, ale nadal próbuję ...

0

Nie, do tej pory, wciąż nic.

Wystarczy wymienić, próbowałem następujące metody, które nie powiodło się:

  1. ustawić wszystko na NULL w „zamknięty” imprezy okna przed usunięciem pliku. Obejmuje to właściwość DocumentViewer.Document i obiekt DocumentViewer.

  2. Używane ShowDialog(), aby otworzyć okno i ustawić go na później. Przeniesiono usunięcie pliku do zdarzenia "Zakończ" obiektu System.Windows.Application, który otwiera okno. Nadal rzuca wyjątek, że plik jest używany.

Błąd DocumentViewer ???

6

Musisz zamknąć plik System.IO.Packaging.Package, z którego został otwarty dokument XpsDocument dla przeglądarki. Ponadto, jeśli chcesz mieć możliwość ponownego otwarcia tego samego pliku w ramach tej samej sesji aplikacji, będziesz musiał usunąć pakiet z PackageStore.

Spróbuj

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

Tak, wiem, że prawdopodobnie nie otworzył XpsDocument z pakietem, a może nawet nie wiedzieć, co się ma - lub opieki - ale NET to zrobił „za” cię za sceny i zapomina o sprzątaniu po sobie.

Powiązane problemy