为什么StorageFile.GetFilesAsync()在dll中崩溃?

时间:2018-11-11 10:46:41

标签: uwp

我制作了一个UWP的dll,并在其中使用了StorageFile.GetFilesAsync()

代码如下:

Task.Factory.StartNew(async () =>
{
    StorageFolder SFolder = KnownFolders.RemovableDevices;
    try
    {
        IReadOnlyList<StorageFile> SFile = await SFolder.GetFilesAsync();
    }
    catch (Exception ex)
    {
        throw ex;
    }
}); 

我运行程序后,它崩溃并发生以下异常:

{System.UnauthorizedAccessException: Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()

似乎我无权访问该文件。但是,我检查了引用dll的UWP程序,该UWP程序已经声明了可移动存储的功能。

enter image description here

它出什么问题了?你能告诉我如何解决这个问题吗?谢谢。

1 个答案:

答案 0 :(得分:1)

documentation所述,使用KnownFolders.RemovableDevices文件夹有两个先决条件:

  

要访问可移动设备文件夹,您必须:

     
      
  • 在应用清单中,指定可移动存储功能
  •   
  • 在应用清单中,至少注册一个文件类型关联声明。该声明明确指示文件类型   (扩展名)您的应用程序要在可移动设备上访问。   该应用只能枚举,创建或更改具有该文件的文件   在应用清单中声明的​​类型。有关更多信息,请参见处理文件。   激活。
  •   

根据您的问题,您已经处理了第一个先决条件,但您还需要满足第二个先决条件-即指定应用程序使用的文件类型。可以在Package.appxmanifest 声明标签中完成。您可以在下拉菜单中选择文件类型关联,并填写必填字段。

对可移动存储的访问仅限于您指定的文件类型的原因是一项额外的安全措施,因此用户可以放心,该应用程序不会做任何有害的事情。如果您需要对文件系统位置的完全访问权限,则需要使用内置的FolderPicker或使用broadFilesystemAccess capability(这是受限制的功能,并且在Microsoft Store认证期间已进行验证,是否该应用实际上有充分的理由声明它。)