即使授予访问权限,在 UWP 中访问文件也会引发 UnauthorizedAccessException

问题描述

我正在尝试浏览文件并将它们发送到服务,为此我正在 UWP 中制作一个小型内部实用程序。

我制作了一个 POC 控制台应用程序,一切正常。

现在我在一个 UWP 应用中,并且在执行相同的代码时得到一个 @State

我必须补充一点,异常来自我正在使用的包(但我没有开发),我假设因为它在控制台应用程序而不是 UWP 应用程序中工作,错误来自我的最后,不过,这里是完整的错误消息:

System.UnauthorizedAccessException

我已在文件系统隐私设置中授权该应用程序

enter image description here

我在清单中也做了同样的事情:

An exception of type 'System.UnauthorizedAccessException' occurred in System.Private.CoreLib.dll but was not handled in user code
Access to the path 'D:\pulseinvoices\uk_00003.pdf' is denied.

我在某处读到过将文件设置为环境变量也是必要的。这将完全违背文件选择的目的(如果用户每次需要选择文件时都需要设置一个环境变量,那是不切实际的),但是,嘿,我愿意接受建议,所以我也这样做了:

enter image description here

为了尽可能完整,这里是我正在执行的代码

<Package
  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
  xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
  xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
 
  IgnorableNamespaces="uap mp rescap">

...

  <Capabilities>
    <rescap:Capability Name="broadFileSystemAccess" />
    <Capability Name="internetClient" />
    <uap:Capability Name="documentsLibrary"/>
  </Capabilities>

我迷路了,因为控制台应用程序运行良好,执行此代码仅在 UWP 应用程序中失败。

重要private static readonly string FILE = @"D:\pulseinvoices\uk_00003.pdf"; //Test document await service.ProcessAndWait(FILE,channel,params); 对象来自外部 .dll,正如我之前在帖子中所说。我仍然希望问题出在我的最后,所以我可以解决它。所以我有使用 service 的路径,但是当 .dll 试图访问它时,我得到了异常。该 .dll 在我的解决方案中,因此它应该具有与解决方案相同的访问权限,对吗?

一切都是硬编码的,在现阶段这几乎是一个单行应用程序。唯一的区别是它在 UWP 和控制台中运行。

我有哪些选择?

编辑:为清楚起见添加更多细节。

这是我在使用外部 .dll 处理文件之前首先获取文件方法

enter image description here

StorageFile 后面,使用文件路径等创建了一个自定义对象,因此我确实有一个 selectFile 对象,该对象当时可在我的 UWP 应用程序中使用。只有一次我使用外部 .dll 并且使用 StorageFile 失败。如果我根本不使用存储文件而只是对路径进行硬编码,我也会遇到相同的异常。我的解决方案可以访问该文件,但该解决方案中的 .dll 不能?

解决方法

即使您声明了 broadFileSystemAccess 功能,您仍然无法通过非 UWP API 访问文件。相反,您必须使用 StorageFile API:

var file = await StorageFile.GetFileFromPathAsync(path);

如果您想与非 UWP API 互操作,您可以使用文件的 Stream。将 using System.IO; 添加到文件顶部,然后阅读:

var stream = await storageFile.OpenStreamForReadAsync();

或者写成:

var stream = await storageFile.OpenStreamForWriteAsync();
,

这种意外行为的原因应该与@Martin Zikmund 所说的相同。当您声明 BroadFileSystemAccess 功能时,您必须使用 StorageFile API 来访问文件。

问题在于 service 对象在 DLL 中使用的是什么 API。 DLL 很有可能使用某些桌面 API 来访问文件,而不是使用 StorageFile API。这将导致问题。