GetFolderFromPathAsync 函数访问被拒绝

3

我正在制作一个Windows 10通用应用程序,希望用户选择一个文件夹来保存应用程序的文档文件。该文件夹的路径保存在ApplicationData.Current.RoamingSettings.Values中。

以下是代码:

首次启动:

var folderPicker = new FolderPicker { SuggestedStartLocation = PickerLocationId.ComputerFolder };
        StorageFolder folder = await folderPicker.PickSingleFolderAsync();
        StorageFolder homeFolder = await folder.CreateFolderAsync("App1 Data", CreationCollisionOption.OpenIfExists);

        var save = ApplicationData.Current.RoamingSettings.Values;
        save["HomeFolder"] = homeFolder.Path;

当设置了HomeFolder时:

string dir = save["HomeFolder"].ToString();
        try
        {
            StorageFolder homeFolder = await StorageFolder.GetFolderFromPathAsync(dir);
        }
        catch (Exception e)
        {
            Debug.WriteLine(e.ToString());
        }

第二个代码示例中抛出的异常是:
System.UnauthorizedAccessException:访问被拒绝(来自HRESULT的异常:0x80070005(E_ACCESSDENIED))
所以我的问题是,你如何正确使用GetFolderFromPathAsync函数? 我检查了所有路径的字符串,它们都是正确的,即使
StorageFolder.GetFolderFromPathAsync(storageFolder.Path);
也不起作用。 你知道解决方法吗?
1个回答

3
直接使用StorageFile而不是转换为路径。
为了将来使用从文件选择器返回的文件,请将StorageFile保存在AccessCache类的FutureAccessList或MostRecentlyUsedList中。该路径不包括打开文件所需的权限。StorageFile携带权限并授予对文件的访问权限。
我在我的博客文章跳出路径:坚持使用StorageFile中更详细地讨论了这个问题。

重启应用后,我能否获取此 FutureAccessList 的项目? - mjw
是的,这就是重点。如果它只在应用程序的单个运行中工作,那么您首先就不需要FutureAccessList;您将继续使用StorageFile。 - Raymond Chen
你好,罗布,我已经阅读了你的博客文章,但对此我有些复杂的感觉——我理解这种方法的原因、特权等等。但如果我需要存储超过1000个文件的位置呢?假设我有一个应用程序,在手机上显示图片,类似数据库,我需要访问用户选择的文件,我不想将用户限制在1000个文件以内。使用PicturesLibrary返回的路径方法来处理存储在手机上的文件是否安全?对于具有大量文件的数据库,最佳实践是什么? - Romasz
更糟糕的是,每个你持有的StorageFile或StorageFolder似乎会导致RuntimeBroker.exe分配大约60k的内存。微软似乎没有采取任何措施解决这个问题。 - Elliot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接