2016-07-25 2 views
1

Как можно завершить/закрыть BitmapEncoder в UWP?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(); 

Теперь, когда я пытаюсь получить доступ к файлу, я получаю System.UnauthorizedAccessException, я должен закрыть UWP приложение, чтобы иметь возможность доступа к этому файлу ... Как я могу закрыть его?

+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); 
    } 
} 
Смежные вопросы