UWP CloudBlob.DownloadFileAsync访问拒绝错误

本文关键字:拒绝 错误 访问 DownloadFileAsync CloudBlob UWP | 更新日期: 2023-09-27 18:07:13

我正在编写一个简单的UWP应用程序,其中用户将InkCanvas笔画信息发送到Azure blockBlob,然后检索一些不同的InkCanvas笔画容器信息以渲染到画布。

我用StrokeContainer.saveAsync()将.ink文件保存到applicationData本地文件夹,保存到相同的位置和相同的文件名(它被每个事务替换),然后用CloudBlockBlob.uploadAsync()上传。

我的问题出现时,试图从我的Azure服务器下载文件-我得到一个"访问拒绝"错误。

 async private void loadInkCanvas(string name)
    {
        //load ink canvas
        //add strokes to the end of the name
        storageInfo.blockBlob = storageInfo.container.GetBlockBlobReference(name + "_strokes"); 
        //check to see if the strokes file exists
        if (await storageInfo.blockBlob.ExistsAsync){
            //then the stroke exists, we can load it in.
            StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
            StorageFile storageFile = await storageFolder.CreateFileAsync("ink.ink", CreationCollisionOption.ReplaceExisting);
            using (var outputStream = await storageFile.OpenAsync(FileAccessMode.ReadWrite))
            {
                await storageInfo.blockBlob.DownloadToFileAsync(storageFile);//gives me the "Access Denied" error here
            }
        }
    }

任何帮助将非常感激,所有我在网上找到的是,你不应该把直接路径到目标位置,而是使用ApplicationData.Current.LocalFolder .

UWP CloudBlob.DownloadFileAsync访问拒绝错误

DownloadToFileAsync方法确实可以帮助您从azure存储读取文件流到本地文件,您不需要自己打开本地文件进行读取。在您的代码中,您打开文件流并使文件被占用,然后调用DownloadToFileAsync方法来尝试访问被占用的文件,从而导致"访问被拒绝"异常。

解决方法很简单,只需下载到本地文件而不打开,代码如下:

if (await blockBlob.ExistsAsync())
{
   //then the stroke exists, we can load it in.
    StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
    StorageFile storageFile = await storageFolder.CreateFileAsync("ink.ink", CreationCollisionOption.ReplaceExisting);
    await blockBlob.DownloadToFileAsync(storageFile);    
}

如果您想自己读取文件流,您需要使用DownloadToStreamAsync方法而不是DownloadToFileAsync,如下所示:

if (await blockBlob.ExistsAsync())
{       
   StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
   StorageFile storageFile = await storageFolder.CreateFileAsync("ink.ink", CreationCollisionOption.ReplaceExisting);
   //await blockBlob.DownloadToFileAsync(storageFile);
   using (var outputStream = await storageFile.OpenAsync(FileAccessMode.ReadWrite))
   {
       await blockBlob.DownloadToStreamAsync(outputStream.AsStreamForWrite());    
   }
}