6

Bir sunucu ve mağazalardan bir görüntü getirir Windows 8 C# uygulamasında aşağıdaki kod var:UnauthorizedAccessException ederken bir dosya kaydetme

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

Ben rastgele bu özel hat üzerinde hataları olsun görünür:

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

Her zaman böyle olmaz, bu yüzden sorunu nasıl belirleyebileceğimi bilmiyorum. Tüm hata ayrıntıları burada:

UnauthorizedAccessException erişim engellendi

yakalandı. (HRESULT özel durum: 0x80070005 (E_ACCESSDENIED)) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification en System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Görev görev) (Görev görev) de System.Runtime.CompilerServices de. d TestApp.MainPage.d__4.MoveNext de TaskAwaiter`1.GetResult() (): \ TestApp \ TestApp \ MainPage.xaml.cs: satır 86

cevap

6

Güncelleme - hatalardır "Erişim engellendi" birden çok şeyden kaynaklanıyor.

İlk neden, görüntünün indirilmesi ile ilgilidir. İndirme kodunda bir şey dosyayı açıyor gibi görünüyor. Aşağıdaki indirme kodunu sadeleştirdim.

İkincisi, dosyayı açmayı tutan BitmapImage nesnesi ile ilgilidir. daha fazla bilgi için bu yazı bakın: İkinci soruna Access Denied when deleting image file previously used in DataTemplate in WinRT

Tek yön BitmapImage başlatmak için bir stream yerine Uri a kullanmaktır. İşte

(orijinal kod burada da, ama yorumlandı) benim için çalışan bir sürümü:

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

Hmm, şimdi bir UnauthorizedAccessException alıyorum (Erişim reddedildi. (HRESULT özel durum: 0x80070005 (E_ACCESSDENIED))) 'var stream = imageFile.OpenAsync (Windows.Storage.FileAccessMode.Read);'. Muhtemelen bu sefer bir izin sorunu var mı? Herhangi bir fikir? :/ – ReignOfComputer

+2

@ReignOfComputer - Güncellenmiş yayınımı görün. Oldukça değişti. –

+0

Omg bunu çok yaptı!Harikasın! : D – ReignOfComputer

1

Ben dosyayı LocalFolder için pdf belgesini indirilen zaman aynı sorunla karşı karşıya olan ve denedi görüntülemek için Ben bu oluyor güvenilir niçin söyleyemem, ama bu küçük kesmek bana bu çözmek için yardımcı:

yerine

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

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

Şimdi bu kullanmak kullanarak:

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

varsa CreationCollisionOption kullanma seçeneği. ReplaceExisting yerine GenerateUniqueName, bunu kullanmayı deneyin.

En azından sorun benim için çözüldü.

İlgili konular