保存文件时出现UnauthorizedAccessException

Rei*_*ter 6 c# error-handling asynchronous unauthorizedaccessexcepti windows-8

我在Windows 8 C#应用程序中有以下代码,它从服务器获取图像并存储它:

        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;
    }
Run Code Online (Sandbox Code Playgroud)

看来我在这个特定的行上随机出错了:

                var imageFile = await ApplicationData.Current.LocalFolder.CreateFileAsync(
         "test.png", CreationCollisionOption.ReplaceExisting);
Run Code Online (Sandbox Code Playgroud)

它并不总是发生,所以我不确定如何查明问题.所有错误详细信息都在这里:

发现了UnauthorizedAccessException

访问被拒绝.(来自HRESULT的异常:0x80070005(E_ACCESSDENIED))System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)位于System.Runtime.CompilerServices.TaskAwaiter`1.GetResult的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) ()位于d:\ TestApp\TestApp\MainPage.xaml.cs中的TestApp.MainPage.d__4.MoveNext():第86行

chu*_*e x 6

更新 - "拒绝访问"错误是由多件事引起的.

第一个原因与下载图像有关.下载代码中出现的东西是保持打开文件.我简化了下面的下载代码.

第二个原因与BitmapImage持有打开文件的对象有关.有关详细信息,请参阅此文章:删除以前在WinRT中的DataTemplate中使用的图像文件时拒绝访问

围绕第二个问题的一种方法是使用a stream而不是a Uri来初始化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;
Run Code Online (Sandbox Code Playgroud)

  • @ReignOfComputer - 请参阅我的最新帖子.它已经发生了很大变化. (2认同)