WinRT

2012-12-05 18 views
5

में डेटा टेम्पलेट में पहले उपयोग की गई छवि फ़ाइल को हटाते समय एक्सेस अस्वीकार किया गया है। मेरे डेटा टेम्पलेट के हिस्से के रूप में मेरे ग्रिड व्यू द्वारा उपयोग की गई छवि (पीएनजी) फ़ाइलें हैं। अगर मैं अपने ग्रिड व्यू में एक विशिष्ट ऑब्जेक्ट पंक्ति को हटाने का प्रयास करता हूं, तो मैं उस पंक्ति के लिए संबंधित छवि फ़ाइल को भी हटा दूंगा। सूची में प्रत्येक आइटम के लिए छवियां अलग-अलग हैं।WinRT

मैं छवि फ़ाइल

StorageFile _file = await DataStore.GetFileAsync(filename); 
await _file.DeleteAsync(StorageDeleteOption.Default); 

छवि फ़ाइल GridView के DataTemplate के तहत GridView पर प्रदान की गई है हटाने के लिए इस कोड का उपयोग कर रहा हूँ। तो मेरी सूची में प्रत्येक ऑब्जेक्ट मॉडल में, मेरे पास एक सार्वजनिक संपत्ति है जो मेरे डेटा टेम्पलेट के लिए एक छवि स्रोत देता है।

मैं सूची से ऑब्जेक्ट पंक्ति हटा दिए जाने के बाद और ग्रिड व्यू को नए सूची आइटमों को रीफ्रेश करने के बाद अपनी हटाई प्रक्रिया को कॉल कर रहा हूं।

हालांकि सूची में ऑब्जेक्ट (छवि का उपभोग करने वाला) नहीं है, फिर भी ऐप को फ़ाइल को हटाने का प्रयास करते हुए एक्सेस अस्वीकृत अपवाद फेंकता है। ऐप चल रहा है, अगर मैं उस विशेष फ़ाइल को मैन्युअल रूप से (फ़ाइल एक्सप्लोरर के माध्यम से) हटाने की कोशिश करता हूं, तो यह मुझे भी अनुमति नहीं देगा।

मैंने अपने ऐप में सभी अप्रयुक्त वस्तुओं को साफ़ करने का प्रयास किया, यहां तक ​​कि ग्रिड व्यू के आइटमसोर्स को शून्य पर सेट करने और छवि को हटाने से पहले सूची को शून्य से सेट करने की कोशिश की। अभी भी अपवाद जारी है।

अग्रिम धन्यवाद।

उत्तर

0

चाल छवि को लोड करने के लिए उरी ऑब्जेक्ट का उपयोग करना है (एक स्ट्रिंग फ़ाइल नाम के बजाय) और फिर फ़ाइल को हटाने के लिए सटीक उरी इंस्टेंस का उपयोग करने के लिए (यूआई से छवि को हटाने के बाद)। यहाँ एक उदाहरण है:

//Save the Uri as a member variable so you can get to it later 
private Uri uri; 

//Create the Uri 
uri = new Uri(OriginalImageFilename, UriKind.Absolute); 

//Load the image 
BitmapImage bitmapImage = new BitmapImage(uri); 
//This can also be done by binding a Image control's source property to the uri. 

//Delete the image (remember to use the same Uri instance) 
StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(uri); 
await file.DeleteAsync(); 
+0

धन्यवाद @ kinect_dev, लेकिन जब भी मैंने आपके सुझाव की कोशिश की तो मुझे अभी भी त्रुटि मिल रही है। – King

0

एक के रूप में काम के आसपास, मैं सिर्फ अप्रयुक्त छवियों एप्लिकेशन लॉन्च के दौरान नष्ट कर दिया है ताकि कोई प्रक्रियाओं प्रयोग कर रहे हैं। धन्यवाद।

1

एक विधि जिसे आप कोशिश कर सकते हैं वह छवि को मेमोरी स्टीम में लोड करना है, फिर उस स्ट्रीम से BitmapImage ऑब्जेक्ट बनाएं, फिर आप उस बिटमैप छवि पर अपने Image नियंत्रण का स्रोत सेट कर सकते हैं।

के बाद से आप छवि का स्रोत के रूप में वास्तविक छवि फ़ाइल का उपयोग नहीं कर रहे हैं, आप आसानी से यह कभी भी हालांकि इस एक पुराने सवाल यह है कि नष्ट कर सकते हैं :)

1

, मैं एक UWP अनुप्रयोग में हाल ही में समस्या का सामना करना पड़ा और वास्तव में एक समाधान खोजने में कामयाब रहे। लेकिन पहले समस्या के बारे में कुछ पृष्ठभूमि जानकारी:

जब आप एक यूआरआई के साथ बिटमैप छवि बनाते हैं, तो बनाई गई यूआरआई ऑब्जेक्ट आपके स्थानीय भंडारण में फ़ाइल का संदर्भ रखती है और इसे खोलती है, यानी गैर-लिखने योग्य। यह बीटीडब्ल्यू केवल तभी सच है जब बिटमैप पूरी तरह से छवि में फ़िट होने के लिए काफी बड़ा है, आमतौर पर छोटे या मध्यम आकार के बिटमैप्स। यदि बिटमैप काफी बड़ा होता है, तो एक छवि में प्रदर्शित होने पर WinRT स्वचालित रूप से डाउनस्प्लेड संस्करण का उपयोग करता है। इस मामले में यूआरआई मूल फ़ाइल का संदर्भ नहीं रखता है।

अब वास्तविक समाधान के लिए:

अशक्त करने के लिए Image.Source स्थापना यहाँ चाल नहीं करता है, के रूप में यूआरआई अभी भी जीवित है (जब तक अगले जीसी चक्र कम से कम)। मेरे लिए क्या काम किया गया था, बिटमैप इमेज को स्रोत कास्टिंग कर रहा था, मूल रूप से यह था और यूरीसोर्स को शून्य करने के लिए सेटिंग्स।

var bitmapImage = image.Source as BitmapImage; 
if (bitmapImage != null) 
    bitmapImage.UriSource = null; 

और हाँ, यह बेवकूफ है।