我正在编写一个简单的UWP应用程序,其中用户将InkCanvas笔划信息发送到Azure blockBlob,然后检索一些不同的InkCanvas笔划容器信息以呈现到画布。
我将.ink文件保存到带有StrokeContainer.saveAsync()的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。
答案 0 :(得分:0)
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());
}
}