6

मैं किसी Windows 8 सी # एप्लिकेशन में निम्न कोड है जो एक सर्वर और दुकानों से एक छवि को हासिल करेगा यह है:UnauthorizedAccessException जबकि एक फ़ाइल को सहेजने

 private async Task httpFetcher() 
    { 
     HttpClient httpClient = new HttpClient(); 
     HttpRequestMessage request = new HttpRequestMessage(
HttpMethod.Get, "http://www.example.com/fakeImageRotator.php"); // FOR EXAMPLE 
     HttpResponseMessage response = await httpClient.SendAsync(request, 
      HttpCompletionOption.ResponseHeadersRead); 

     Uri imageUri; 
     BitmapImage image = null; 

     try 
     { 
      var imageFile = await ApplicationData.Current.LocalFolder.CreateFileAsync(
     "test.png", CreationCollisionOption.ReplaceExisting); 
      var fs = await imageFile.OpenAsync(FileAccessMode.ReadWrite); 
      DataWriter writer = new DataWriter(fs.GetOutputStreamAt(0)); 
      writer.WriteBytes(await response.Content.ReadAsByteArrayAsync()); 
      await writer.StoreAsync(); 
      writer.DetachStream(); 
      await fs.FlushAsync(); 
      writer.Dispose(); 

      if (Uri.TryCreate(imageFile.Path, UriKind.RelativeOrAbsolute, out imageUri)) 
      { 
       image = new BitmapImage(imageUri); 
      } 

     } 
     catch (Exception e) 
     { 
      return; 
     } 

     image1.Source = image; 
    } 

ऐसा लगता है कि मैं बिना किसी क्रम के इस विशेष लाइन पर त्रुटियों मिलती है:

   var imageFile = await ApplicationData.Current.LocalFolder.CreateFileAsync(
     "test.png", CreationCollisionOption.ReplaceExisting); 

यह हमेशा नहीं होता है, इसलिए मुझे यकीन नहीं है कि इस मुद्दे को कैसे ठीक किया जाए। सभी त्रुटि विवरण यहां हैं:

UnauthorizedAccessException पकड़ा गया था

प्रवेश निषेध है। System.Runtime.CompilerServices पर System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification पर System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (टास्क कार्य) (टास्क कार्य) पर: (0x80070005 (E_ACCESSDENIED) HRESULT से अपवाद)। TaskAwaiter`1.GetResult() TestApp.MainPage.d__4.MoveNext पर() में घ: \ TestApp \ TestApp \ MainPage.xaml.cs: लाइन 86

उत्तर

6

अपडेट - "पहुँच अस्वीकृत" त्रुटि नहीं है कई चीजों के कारण होने के कारण।

पहला कारण छवि को डाउनलोड करने से कोई लेना देना नहीं है। ऐसा लगता है कि डाउनलोड कोड में कुछ फ़ाइल खोल रहा है। मैंने नीचे डाउनलोड कोड को सरल बना दिया है।

दूसरा कारण BitmapImage वस्तु खुला पकड़े फ़ाइल से कोई लेना देना नहीं है। अधिक जानकारी के लिए यह पोस्ट देखें: दूसरी समस्या के Access Denied when deleting image file previously used in DataTemplate in WinRT

एक तरह से BitmapImage प्रारंभ करने में एक stream बजाय Uri एक के उपयोग करने के लिए है।

यहाँ (आपके मूल कोड भी यहाँ है, लेकिन बाहर टिप्पणी की) एक संस्करण है कि मेरे लिए काम करता है:

var imageFile = await ApplicationData.Current.LocalFolder.CreateFileAsync(
    "test.png", CreationCollisionOption.ReplaceExisting); 
/* 
var fs = await imageFile.OpenAsync(FileAccessMode.ReadWrite); 
DataWriter writer = new DataWriter(fs.GetOutputStreamAt(0)); 
writer.WriteBytes(await response.Content.ReadAsByteArrayAsync()); 
await writer.StoreAsync(); 
writer.DetachStream(); 
await fs.FlushAsync(); 
writer.Dispose(); 

if (Uri.TryCreate(imageFile.Path, UriKind.RelativeOrAbsolute, out imageUri)) 
{ 
    image = new BitmapImage(imageUri); 
} 
*/ 
var fs = await imageFile.OpenStreamForWriteAsync(); 
await response.Content.CopyToAsync(fs); 
await fs.FlushAsync(); 
// you may want to have this Dispose as part of a 
// finally block (try/ catch/ finally) 
fs.Dispose(); 

var bs = await imageFile.OpenAsync(Windows.Storage.FileAccessMode.Read); 
image = new BitmapImage(); 
image.SetSource(bs); 
... 
image1.Source = image; 
+0

हम्म, मैं अब एक UnauthorizedAccessException हो रही है (। पहुँच HRESULT से इनकार किया है (अपवाद: 0x80070005 (E_ACCESSDENIED))) 'वर धारा = पर इंतजार imageFile.OpenAsync (Windows.Storage.FileAccessMode.Read);'। शायद इस बार एक अनुमति जारी है? कोई उपाय? :/ – ReignOfComputer

+2

@ReignOfComputer - मेरे अद्यतन पोस्ट देखें। यह काफी बदल गया है। –

+0

Omg है कि यह बहुत बहुत धन्यवाद किया!तुम कमाल हो! : डी – ReignOfComputer

1

मैं एक ही समस्या का सामना करना पड़ रहे हैं, जब मैं फ़ाइल LocalFolder को पीडीएफ दस्तावेज़ डाउनलोड किया है और कोशिश की इसे प्रदर्शित करने के लिए। मैं नहीं बता सकता मज़बूती से यह क्यों हो रहा है, लेकिन इस छोटे से हैक मुझे इस का समाधान करने में मदद मिली:

के बजाय का उपयोग कर

try 
{ 
    StorageFile storage = await ApplicationData.Current.LocalFolder.CreateFileAsync(
    fileName, CreationCollisionOption.ReplaceIfExists); 

    //work with file 
} 
catch (Exception) { ... } 

मैं अब इस का उपयोग करें:

StorageFile storage = null; 
try 
{ 
    //First try to get the file 
    storage = await ApplicationData.Current.LocalFolder.GetFileAsync(fileName); 
} 
catch (Exception) 
{ 
    //Ignore this exception 
} 

try 
{ 
    //If the storage file is still null, create it 
    if (storage == null) 
    storage = await ApplicationData.Current.LocalFolder.CreateFileAsync(
     fileName, CreationCollisionOption.OpenIfExists); 

    //Work with file 
} 
catch (Exception) 
{ 
    //Process exception 
} 
1

यदि आपके पास विकल्प CreationCollisionOption उपयोग करने के लिए। GenerateUniqueName ReplaceExisting के बजाय, इस का उपयोग करने का प्रयास करें।

कम से कम यह मेरे लिए समस्या हल हो गई।

संबंधित मुद्दे