storageFile.OpenReadAsync 处的 UnauthorizedAccessException
UnauthorizedAccessException at storageFile.OpenReadAsync
用户可以拍摄多张照片。这些图片存储在ApplicationData.Current.LocalFolder:
folderBatch = await ApplicationData.Current.LocalFolder.CreateFolderAsync("Batch", CreationCollisionOption.OpenIfExists);
当用户拍照时,触发此方法:
public async void GetAndProcessImage()
{
IBuffer ImageBuffer = null;
if (App.settings.ImageSource == MyImageSource.Camera)
ImageBuffer = await Camera.TakePhotoAsync();
// store in batch folder
IReadOnlyList<StorageFile> listFiles = await folderBatch.GetFilesAsync();
int iNumberOfFiles = listFiles.Count;
StorageFile fileTarget = await folderBatch.CreateFileAsync(string.Format("batch{0}.jpg", iNumberOfFiles));
IRandomAccessStream filestream = await fileTarget.OpenAsync(FileAccessMode.ReadWrite);
await filestream.GetOutputStreamAt(0).WriteAsync(ImageBuffer);
await filestream.FlushAsync();
}
图片是用上面GetAndProcessImage调用的这个方法拍的:
public async Task<IBuffer> TakePhotoAsync()
{
Debug.WriteLine("taking picture...");
InMemoryRandomAccessStream stream = new InMemoryRandomAccessStream();
if (mediaCapture.VideoDeviceController.FocusControl.Supported)
await mediaCapture.VideoDeviceController.FocusControl.FocusAsync();
try
{
await mediaCapture.CapturePhotoToStreamAsync(ImageEncodingProperties.CreateJpeg(), stream);
}
catch (Exception e)
{
ExceptionHandler.Instance.HandleException(e);
}
IBuffer ibuffer = await StreamHelpers.StreamToIBuffer(stream);
return ibuffer;
}
当用户完成后,he/she 可以按一个按钮开始读取批处理文件:
MyFile file = new KNFBFile(string.Format("{0}\{1}.knfb", ApplicationData.Current.LocalFolder.Path, string.Format("Batch-{0:yyyyMMdd-hh-mm-ss-tt}", DateTime.Now)));
uint iCount = 0;
foreach (StorageFile filebatch in listFiles)
{
await App.converter.ConvertBatchJPG(filebatch);
IRandomAccessStream imagestream = await StreamHelpers.IBufferToStream(App.ocr.LastImageBuffer);
file.SavePage(iCount++, imagestream);
}
此方法现在称为:
public async Task ConvertBatchJPG(StorageFile fileSource)
{
IRandomAccessStream JPGStream = await fileSource.OpenReadAsync();
-->上面的方法(OpenReadAsync)导致异常
...
}
您需要处置 filestream
和 您正在检索的 outputstream
:
StorageFile fileTarget = await folderBatch.CreateFileAsync(string.Format("batch{0}.jpg", iNumberOfFiles));
using(IRandomAccessStream filestream = await fileTarget.OpenAsync(FileAccessMode.ReadWrite))
{
using(var outStream = filestream.GetOutputStreamAt(0))
{
await outStream.WriteAsync(ImageBuffer);
}
await filestream.FlushAsync();
}
由于您没有改变 OpenAsync()
返回的流,您还可以避免创建中间输出流:
using(IRandomAccessStream filestream = await fileTarget.OpenAsync(FileAccessMode.ReadWrite))
{
await filestream .WriteAsync(ImageBuffer);
await filestream.FlushAsync();
}
用户可以拍摄多张照片。这些图片存储在ApplicationData.Current.LocalFolder:
folderBatch = await ApplicationData.Current.LocalFolder.CreateFolderAsync("Batch", CreationCollisionOption.OpenIfExists);
当用户拍照时,触发此方法:
public async void GetAndProcessImage()
{
IBuffer ImageBuffer = null;
if (App.settings.ImageSource == MyImageSource.Camera)
ImageBuffer = await Camera.TakePhotoAsync();
// store in batch folder
IReadOnlyList<StorageFile> listFiles = await folderBatch.GetFilesAsync();
int iNumberOfFiles = listFiles.Count;
StorageFile fileTarget = await folderBatch.CreateFileAsync(string.Format("batch{0}.jpg", iNumberOfFiles));
IRandomAccessStream filestream = await fileTarget.OpenAsync(FileAccessMode.ReadWrite);
await filestream.GetOutputStreamAt(0).WriteAsync(ImageBuffer);
await filestream.FlushAsync();
}
图片是用上面GetAndProcessImage调用的这个方法拍的:
public async Task<IBuffer> TakePhotoAsync()
{
Debug.WriteLine("taking picture...");
InMemoryRandomAccessStream stream = new InMemoryRandomAccessStream();
if (mediaCapture.VideoDeviceController.FocusControl.Supported)
await mediaCapture.VideoDeviceController.FocusControl.FocusAsync();
try
{
await mediaCapture.CapturePhotoToStreamAsync(ImageEncodingProperties.CreateJpeg(), stream);
}
catch (Exception e)
{
ExceptionHandler.Instance.HandleException(e);
}
IBuffer ibuffer = await StreamHelpers.StreamToIBuffer(stream);
return ibuffer;
}
当用户完成后,he/she 可以按一个按钮开始读取批处理文件:
MyFile file = new KNFBFile(string.Format("{0}\{1}.knfb", ApplicationData.Current.LocalFolder.Path, string.Format("Batch-{0:yyyyMMdd-hh-mm-ss-tt}", DateTime.Now)));
uint iCount = 0;
foreach (StorageFile filebatch in listFiles)
{
await App.converter.ConvertBatchJPG(filebatch);
IRandomAccessStream imagestream = await StreamHelpers.IBufferToStream(App.ocr.LastImageBuffer);
file.SavePage(iCount++, imagestream);
}
此方法现在称为:
public async Task ConvertBatchJPG(StorageFile fileSource)
{
IRandomAccessStream JPGStream = await fileSource.OpenReadAsync();
-->上面的方法(OpenReadAsync)导致异常 ... }
您需要处置 filestream
和 您正在检索的 outputstream
:
StorageFile fileTarget = await folderBatch.CreateFileAsync(string.Format("batch{0}.jpg", iNumberOfFiles));
using(IRandomAccessStream filestream = await fileTarget.OpenAsync(FileAccessMode.ReadWrite))
{
using(var outStream = filestream.GetOutputStreamAt(0))
{
await outStream.WriteAsync(ImageBuffer);
}
await filestream.FlushAsync();
}
由于您没有改变 OpenAsync()
返回的流,您还可以避免创建中间输出流:
using(IRandomAccessStream filestream = await fileTarget.OpenAsync(FileAccessMode.ReadWrite))
{
await filestream .WriteAsync(ImageBuffer);
await filestream.FlushAsync();
}