2008-11-12 6 views
10

जारी नहीं करता है मैं एक WPF अनुप्रयोग पर काम कर रहा हूं जो एक्सपीएस दस्तावेज़ खोलता है और प्रदर्शित करता है। जब एप्लिकेशन बंद हो जाता है, तो विनिर्देश यह है कि एप्लिकेशन को साफ़ अप के लिए खोले गए एक्सपीएस दस्तावेज़ को हटाना चाहिए। हालांकि, एक निश्चित एक्सपीएस दस्तावेज़ खोलते समय, एप्लिकेशन एक अपवाद फेंकता है कि जब फ़ाइल इसे हटाने का प्रयास करती है तो फ़ाइल अभी भी उपयोग में है। यह थोड़ा अजीब है क्योंकि यह केवल तब होता है जब कोई विशेष एक्सपीएस दस्तावेज़ खोलता है और केवल तभी जब आप पहले पृष्ठ से आगे बढ़ जाते हैं।WPF DocumentViewer XPS फ़ाइल

कोड मैं प्रयोग किया जाता में से कुछ नीचे दिखाया गया है:

XPS दस्तावेज़ खोलने के लिए: एक्सपीएस दस्तावेज़ नेविगेट करने के लिए

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

: DocumentViewer वस्तु को बंद करने के लिए

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

और फ़ाइल को हटाना:

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

यह सब बहुत ही बुनियादी है और यह हमारे द्वारा परीक्षण किए गए अन्य दस्तावेजों के साथ काम करता है। लेकिन विशेष एक्सपीएस दस्तावेज़ के साथ, एक अपवाद यह कहता है कि हटाई जाने वाली फ़ाइल अभी भी उपयोग की जा रही है।

क्या मेरे कोड से कुछ गलत या गायब है?

धन्यवाद!

उत्तर

2

xpsDocument एक सदस्य हो, उसके बाद() इस पर करीब कॉल नहीं करते :)

+0

अरे यह काम किया! मैंने बस XpsDocument ऑब्जेक्ट को खुल दिया और केवल बाहर निकलने के दौरान XpsDocument.Close() कहा और मैं फ़ाइल को हटाने में सक्षम था। धन्यवाद moogs! –

+1

यह केवल तभी काम करता है जब आप लॉक को रिलीज़ करने के लिए अपना एप्लिकेशन बंद कर सकें। यदि आपको अपना एप्लिकेशन खुला रहता है तो आपको लॉक की आवश्यकता होती है, तो आपको नीचे अपना जवाब या http://stackoverflow.com/questions/1442607/how-do-i-get-wpfs-documentviewer-to-release-its में देखना होगा -file-लॉक-ऑन-स्रोत-XPS-दस्तावेज –

0

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

आप पता लगा सकते हैं, जो संभाल और अप्रबंधित ढेर WinDbg

का उपयोग कर रखती है संपादित करें: और निश्चित रूप से, आप भी कामयाब स्टैक ट्रेस हो और एसओएस विस्तार के माध्यम से चारों ओर से प्रहार कर सकते हैं (http://msdn.microsoft.com/en-us/library/bb190764.aspx)

0

उत्तर के लिए धन्यवाद!

यह थोड़ा कम स्तर है लेकिन जब मैं विचारों से बाहर निकलता हूं तो मैं इसे ध्यान में रखूंगा। वैसे भी, मुझे बग के बारे में थोड़ा और पता चला। अपवाद का कारण बनने वाले विशेष दस्तावेज़ में छवियां डाली गई हैं। जब मैं छवियों को हटा देता हूं, तो अपवाद नहीं होता है। यह शायद एक दस्तावेज़ व्यूअर बग हो सकता है लेकिन मैं अभी भी कोशिश कर रहा हूं ...

0

नहीं, अभी तक कुछ भी नहीं।

बस की गणना करने में, मैं निम्न विधियों कि विफल कोशिश की है: अशक्त करने के लिए

  1. सब कुछ सेट विंडो के "बंद" घटना में फ़ाइल को हटाने से पहले। इसमें DocumentViewer.Document प्रॉपर्टी और DocumentViewer ऑब्जेक्ट शामिल है।

  2. विंडो को खोलने के लिए प्रयुक्त ShowDialog() और इसे बाद में शून्य पर सेट करें। फ़ाइल को हटाने के लिए सिस्टम को "निकास" घटना में हटा दिया गया है। विंडोज़। एप्लिकेशन ऑब्जेक्ट जो विंडो खोल रहा है। अभी भी अपवाद फेंकता है कि फ़ाइल का उपयोग किया जा रहा है।

दस्तावेज़ व्यूअर बग ???

0

मुझे लगता है आप के रूप में http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework/topic59281.aspx

ही समस्या का सामना कर रहे हैं DocumentViewer में एक बग की तरह लगता है यह होना चाहिए नेस्टेड बिटमैप डिकोडर्स का निस्तारण किया है या छवि को एक अलग बिटमैप कैशिंग विकल्प के साथ लोड किया है।

6

आपको System.IO.Packaging.Package को बंद करने की आवश्यकता है जिससे दर्शक को एक्सपीएस डॉक्यूमेंट खोला गया था। इसके अलावा, यदि आप उसी एप्लिकेशन सत्र में एक ही फ़ाइल को फिर से खोलने में सक्षम होना चाहते हैं, तो आपको पैकेजस्टोर से पैकेज को हटाना होगा।

प्रयास करें

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 नहीं खुला था और यहां तक ​​कि एक क्या है पता नहीं हो सकता है पता है - या देखभाल - लेकिन नेट इसके पीछे किया "के लिए" आप दृश्यों और खुद के बाद साफ करने के लिए भूल जाता है।