DriveInfo.GetDrives() 返回系统识别的所有逻辑驱动器数组,包含盘符但不保证可访问;需检查 IsReady 并过滤 DriveType 才能获取可用本地驱动器。

用 DriveInfo.GetDrives() 获取所有逻辑驱动器
这是最直接的方式,DriveInfo.GetDrives() 返回当前系统中所有逻辑驱动器的 DriveInfo 数组,包括已挂载的物理磁盘分区、U 盘、光驱、网络驱动器(若已映射)等。
注意:它不区分“是否可访问”,只反映系统识别出的逻辑盘符。部分驱动器可能因权限、未格式化或脱机而无法读取属性。
- 返回结果包含所有盘符,如
"C:\\"、"D:\\"、"Z:\\"等,即使该驱动器当前无介质(如空光驱)也会列出 - 需引用
System.IO命名空间 - 对每个
DriveInfo实例,建议先检查IsReady属性再访问TotalSize或AvailableFreeSpace,否则会抛出IOException
只获取可用且可读的本地驱动器
如果只想列出用户能实际操作的盘符(比如资源管理器里显示为“本地磁盘”的那些),需要额外过滤:
- 排除
DriveType.NoRootDirectory(如某些虚拟设备)和DriveType.Unknown - 排除
DriveType.CDRom(光驱)或DriveType.Network(除非你明确需要) - 必须检查
drive.IsReady == true,否则访问DriveFormat或空间信息会失败
示例片段:
var drives = DriveInfo.GetDrives()
.Where(d => d.DriveType == DriveType.Fixed || d.DriveType == DriveType.Removable)
.Where(d => d.IsReady)
.Select(d => d.Name)
.ToArray();
为什么 GetDrives() 有时返回空或报错
常见原因不是代码问题,而是执行环境或权限限制:
- 在某些沙盒环境(如部分容器、受限的 Windows 应用沙箱)中,.NET 可能无法枚举全部驱动器
- 以低权限运行时,访问某些系统保留卷(如恢复分区
Recovery (D:))可能触发访问拒绝,导致IsReady为false或属性读取异常 - 调用发生在系统启动早期(如服务初始化阶段),部分驱动器尚未完成枚举,此时结果可能不全
遇到空数组,先用管理员权限运行测试程序,再确认是否真无驱动器,还是被过滤掉了。
对比 Environment.GetLogicalDrives()
这个方法更轻量,只返回字符串数组(如 {"C:\\", "D:\\", "E:\\"}),不提供任何驱动器状态信息。
- 速度快,无 I/O,适合仅需盘符列表的场景(如填充下拉框)
- 不检查是否存在或是否就绪,所以后续访问前仍需做
Directory.Exists()或try/catch - 返回结果与
GetDrives()的Name字段基本一致,但不保证顺序,也不含驱动器类型信息
如果你只需要盘符字符串,且不关心是否可用,用它更简单;否则优先选 DriveInfo.GetDrives() 并做好健壮性处理。
真正容易被忽略的是:IsReady 不是布尔开关,而是访问状态快照——同一驱动器在两次调用间可能插入/弹出,所以生产代码里别缓存 IsReady == true 的结果去反复读取空间信息。











