0

У меня есть следующий код, который извлекает динамическое изображение с веб-сервера в моем приложении Windows 8.CreateFileAsync UnauthorizedAccessException

 private async Task httpFetcher() 
    { 
     HttpClient httpClient = new HttpClient(); 
     HttpRequestMessage request = new HttpRequestMessage(
HttpMethod.Get, "http://www.reignofcomputer.com/imgdump/sample.png"); 
     HttpResponseMessage response = await httpClient.SendAsync(request, 
      HttpCompletionOption.ResponseHeadersRead); 

     Uri imageUri; 
     BitmapImage image = null; 

      var imageFile = await ApplicationData.Current.LocalFolder.CreateFileAsync(
     "sample.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); 
      } 

     image1.Source = image; 
    } 

Это работает большую часть времени, но по какой-то причине, бывают случаи, когда я получаю

UnauthorizedAccessException (0x80070005, E_ACCESSDENIED), HResult -2147024891.

Поскольку ошибки являются случайными и обычно работают, я не уверен, где проблема.

Любая помощь будет оценена по достоинству.

+0

Возможно, файл с таким же именем уже существует. 'CreateFileAsync' пытается заменить существующий файл, но он заблокирован другим процессом. – Leri

+0

Хм, любая идея, как я могу проверить это, и если да, то как я могу заставить приложение ждать, пока файл не будет разблокирован, прежде чем продолжить? – ReignOfComputer

+0

Вы можете создать ситуацию, описанную в моем комментарии самостоятельно. «Как я могу заставить приложение ждать, пока файл не будет разблокирован, прежде чем продолжить?» Это не очень хорошая идея. Вы никогда не знаете, что делает другой процесс. Для этого процесса может потребоваться несколько часов для _unlock_ файла. – Leri

ответ

0

У меня такая же проблема недавно, после некоторого теста я обнаружил, что это потому, что некоторые программы могут удалять файл, когда вы пытаетесь получить к нему доступ. Вот как я сделал тест.

static void Main(string[] args) 
    { 
     Thread t1 = new Thread(Create); 
     Thread t2 = new Thread(Delete); 

     t1.Start(); 
     t2.Start(); 

    } 


    private static void Create() 
    { 

     int i = 0; 
     try 
     { 
      while (true) 
      { 
       System.IO.TextWriter writer = new System.IO.StreamWriter("file.txt"); 
       i++; 
       System.Console.Out.WriteLine(i); 
       writer.Write(i); 
       writer.Close(); 
      } 
     } 
     catch (System.UnauthorizedAccessException ex) 
     { 
      System.Console.Out.WriteLine("Boom at: " + i.ToString()); 
     } 


    } 

    private static void Delete() 
    { 

     while (true) 
     { 
      try 
      { 

       System.IO.File.Delete("file.txt"); 
      } 
      catch (UnauthorizedAccessException ex) 
      { 

      } 
      catch (Exception e) 
      { } 
     } 

    } 
Смежные вопросы