如何获取MediaDevice的MediaStorageInfo?GetStorageInfo无法识别求助
解决MediaDevices获取存储容量与可用空间的问题
你遇到的GetStorageInfo无法解析的问题,核心是手册示例里的这个方法是库自带的扩展方法,需要绑定到具体的设备存储对象上使用,不是凭空调用的。咱们一步步来修正你的代码:
1. 先确认命名空间引用
首先确保代码顶部引入了MediaDevices命名空间——这个扩展方法就藏在这里:
using MediaDevices;
2. 修正代码逻辑:正确的存储信息获取流程
你之前直接实例化MediaStorageInfo是没用的,它必须和设备的实际存储对象绑定。正确的步骤是:
- 枚举所有媒体设备
- 连接目标设备(必须走这一步,否则无法访问设备内部信息)
- 获取设备上的所有存储类功能对象(比如内部存储、SD卡)
- 对每个存储对象调用扩展方法,拿到有效的
MediaStorageInfo
完整的可运行代码示例:
// 枚举系统中所有的媒体设备 var allMediaDevices = MediaDevice.GetDevices(); foreach (var device in allMediaDevices) { device.Connect(); // 必须先连接设备 try { // 获取设备上所有的存储功能对象(可能包含内部存储、SD卡等) var storageObjects = device.FunctionalObjects(FunctionalCategory.Storage); foreach (var storageObj in storageObjects) { // 调用扩展方法GetStorageInfo(),获取当前存储的详细信息 MediaStorageInfo storageInfo = storageObj.GetStorageInfo(); // 读取总容量和可用空间(单位:字节) ulong totalCapacity = storageInfo.Capacity; ulong freeSpaceBytes = storageInfo.FreeSpaceInBytes; // 转成更易读的GB格式 double totalGB = totalCapacity / (1024.0 * 1024.0 * 1024.0); double freeGB = freeSpaceBytes / (1024.0 * 1024.0 * 1024.0); // 输出信息 Console.WriteLine($"设备名称:{device.FriendlyName}"); Console.WriteLine($"存储分区:{storageObj.Name}"); Console.WriteLine($"总容量:{totalGB:F2} GB"); Console.WriteLine($"可用空间:{freeGB:F2} GB\n"); } } finally { // 无论是否出错,都要断开连接,避免资源泄漏 device.Disconnect(); } }
3. 为什么你的原代码无法工作?
- 直接
new MediaStorageInfo()得到的是一个空对象,没有绑定任何实际设备的存储,所以读取的容量都是无效值。 GetStorageInfo是IMediaObject的扩展方法,必须通过设备返回的存储功能对象来调用,不能单独使用。
额外注意事项
- 必须调用
device.Connect()才能访问设备的内部存储信息,否则会抛出权限或连接异常。 - 一定要在
finally块中执行device.Disconnect(),避免设备长期处于占用状态。 - 部分设备(比如智能手机)可能有多个存储分区,
FunctionalObjects(FunctionalCategory.Storage)会返回多个对象,需要遍历处理。
内容的提问来源于stack exchange,提问作者posh
相关产品推荐
相关产品推荐

