6

I 서버와 저장에서 이미지를 가져 오는 윈도우 8의 C# 응용 프로그램에서 다음과 같은 코드가 있습니다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는 액세스가 거부

붙 잡혔다. (HRESULT에서 예외 : 0x80070005와 (E_ACCESSDENIED)) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification에서 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (작업 작업) (작업 작업)에서 System.Runtime.CompilerServices에서. D에 TestApp.MainPage.d__4.MoveNext에서 TaskAwaiter`1.GetResult() () : \ TestApp가 \ TestApp가 \의 MainPage.xaml.cs를 : 라인 86

답변

6

업데이트 - 오류가있는 "액세스가 거부되었습니다" 여러 가지로 인해 발생합니다.

첫 번째 원인은 이미지 다운로드와 관련이 있습니다. 다운로드 코드에서 파일을 여는 중입니다. 아래의 다운로드 코드를 단순화했습니다.

두 번째 원인은 파일을 여는 BitmapImage 개체와 관련이 있습니다. 자세한 내용은이 게시물을 참조하십시오. Access Denied when deleting image file previously used in DataTemplate in WinRT

Uri 대신 stream을 사용하면 BitmapImage을 초기화 할 수 있습니다. 여기

는 (원래 코드가 여기에 있습니다,하지만 주석) 나를 위해 작동 버전입니다 :

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

흠, 이제 var stream = await imageFile.OpenAsync (Windows.Storage.FileAccessMode.Read);에서 UnauthorizedAccessException (액세스가 거부되었습니다 (HRESULT : 0x80070005 (E_ACCESSDENIED) 예외)가 발생했습니다. 아마도 이번에는 권한 문제일까요? 어떤 생각? :/ – ReignOfComputer

+2

@ReignOfComputer - 업데이트 된 게시물을 참조하십시오. 꽤 바뀌 었습니다. –

+0

감사합니다.너 멋지다! :디 – ReignOfComputer

1

내가 파일을 로컬 폴더 할 수있는 PDF 문서를 다운로드 할 때 같은 문제에 직면하고 및 시도 그것을 표시합니다. 나는 이런 일이 안정적으로 이유를 알 수는 없지만,이 작은 해킹 날이 해결하는 데 도움이 :

을 대신

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을 사용하십시오.

적어도 문제가 해결되었습니다.

관련 문제