用 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的结果去反复读取空间信息。
