【问题标题】:UWP - DriveInfo gives access denied for removable storage even if included in capabilityUWP - 即使包含在功能中,DriveInfo 也会拒绝对可移动存储的访问
【发布时间】:2021-04-06 12:19:53
【问题描述】:

我在一个管理可移动设备的 UWP 应用程序上工作。所以,我确保在清单中有这个。

<Capabilities>
   <uap:Capability Name="removableStorage"/>
</Capabilities>

我需要获取设备的可用空间和总空间。所以,我像这样使用 DriveInfo。

DriveInfo z = new DriveInfo(@"E:\");
long x = z.TotalFreeSpace;

当他尝试获取可用空间并将其分配给 x 时,会出现以下异常:

System.UnauthorizedAccessException : 'Access to the path 'E:\' is denied.'

如您所见,该驱动器实际上是一个可移动驱动器。

一旦检测到并添加了驱动器,我需要的过程就会发生。因此,这发生在 DeviceWatcher 的已添加事件中。我在监视窗口中看到设备未准备好IsReady=false。也许我太早尝试访问它?该事件是“添加”,而不是“添加”,UnauthorizedAccessException 不是应该发生的事件。我想DeviceNotReadyException 会更合适。所以,我的结论是问题与它没有准备好无关。

【问题讨论】:

  • 查看daniel-krzyczkowski.github.io/…这可能有助于解决您的问题
  • 是的,我已经看到了广泛的文件系统访问能力,但我需要向 Microsoft 证明这个选择是正确的,这是我无法做到的。所以,无论如何,谢谢。

标签: c# uwp driveinfo


【解决方案1】:

即使声明了 removableStorage 功能,您仍然需要使用 UWP API 来访问文件 - 这意味着使用 StorageFolder API。您可以使用:

var drives = await KnownFolders.RemovableDevices.GetFoldersAsync();

检索您可以查询的所有可移动驱动器。 KnownFolders.RemovableDevices 实际上是一个虚拟文件夹,其中包含每个可移动驱动器的子文件夹(请参阅docs)。要检查驱动器号,您可以检查每个文件夹的Path

要取回剩余的可用空间,您可以检查可移动存储文件夹的属性:

var properties = await folder.Properties.RetrievePropertiesAsync(
    new string[] { "System.FreeSpace" });
return (UInt64)properties["System.FreeSpace"];

【讨论】:

  • 感谢您提供的信息,但 GetFolders 无关紧要,因为我希望得到观察者的通知。关于属性,很难找到哪个设备支持哪些属性。我发现了 DriveInfo 并想使用它。我使用您的方法作为解决方法,并在 github 上通知了框架团队。由于您的解决方案与我所做的相近,因此您将赢得一分!
猜你喜欢
  • 1970-01-01
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多