2016-07-25 4 views
1

UWP에서 BitmapEncoder를 마무리/닫을 수 있습니까? 내가 파일에 액세스하려고 할 때UWP BitmapEncoder 파일을 닫으시겠습니까?

InMemoryRandomAccessStream imras = new InMemoryRandomAccessStream(); 
await [...] //Fill stream 
BitmapDecoder decoder = await BitmapDecoder.CreateAsync(imras); 
[...] //Do something 
StorageFile sf = await ApplicationData.Current.LocalFolder.CreateFileAsync("123.jpg", CreationCollisionOption.ReplaceExisting); 
BitmapEncoder bmpEncoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, await sf.OpenAsync(FileAccessMode.ReadWrite)); 
[...] 
await bmpEncoder.FlushAsync(); 
imras.Dispose(); 

는 지금, 나는 내가 어떻게 닫을 수 있습니다 ... 나는 UWP 응용 프로그램이 파일에 액세스 할 수 닫아야하는 System.UnauthorizedAccessException를 얻을?

+0

결정적 파괴가 필요한 경우 제공 할 수없는 언어 (C#) 또는 플랫폼 (.NET)을 사용하지 마십시오. 'using' 문과 함께'IDisposable' 패턴은 사용하지 않습니다. 당신은 kludge (이것을 기반으로)를 구현하거나 불필요한 관리되는 레이어를 모두 삭제할 수 있습니다. – IInspectable

답변

0

모든 IDisposable 개체를 처리해야합니다. 가장 쉬운 방법은 using 키워드를 사용하는 것입니다.

using (var stream = await storageFile.OpenAsync()) // Or any other method that will open a stream. 
{ 
    var bitmapDecoder = await BitmapDecoder.CreateAsync(stream); 

    using (var randomAccessStream = new InMemoryRandomAccessStream()) 
    { 
     var bitmapEncoder = await BitmapEncoder.CreateForTranscodingAsync(randomAccessStream, bitmapDecoder); 

     // Do stuff. 

     await bitmapEncoder.FlushAsync(); 

     var buffer = new byte[randomAccessStream.Size]; 

     await randomAccessStream.AsStream().ReadAsync(buffer, 0, buffer.Length); 

     var someNewFile = await ApplicationData.Current.LocalFolder.CreateFileAsync("SomeFileName", CreationCollisionOption.ReplaceExisting); 

     await FileIO.WriteBytesAsync(someNewFile, buffer); 
    } 
}