C#获取所有逻辑驱动器 C#如何列出电脑中所有的盘符

6次阅读

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

C#获取所有逻辑驱动器 C#如何列出电脑中所有的盘符

DriveInfo.GetDrives() 获取所有逻辑驱动器

这是最直接的方式,DriveInfo.GetDrives() 返回当前系统中所有逻辑驱动器的 DriveInfo 数组,包括已挂载的物理磁盘分区、U 盘、光驱、网络驱动器(若已映射)等。

注意:它不区分“是否可访问”,只反映系统识别出的逻辑盘符。部分驱动器可能因权限、未格式化或脱机而无法读取属性。

  • 返回结果包含所有盘符,如 "C:\""D:\""Z:\" 等,即使该驱动器当前无介质(如空光驱)也会列出
  • 需引用 System.IO 命名空间
  • 对每个 DriveInfo 实例,建议先检查 IsReady 属性再访问 TotalSizeAvailableFreeSpace,否则会抛出 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:))可能触发访问拒绝,导致 IsReadyfalse 或属性读取异常
  • 调用发生在系统启动早期(如服务初始化阶段),部分驱动器尚未完成枚举,此时结果可能不全

遇到空数组,先用管理员权限运行测试程序,再确认是否真无驱动器,还是被过滤掉了。

对比 Environment.GetLogicalDrives()

这个方法更轻量,只返回字符串数组(如 {"C:\", "D:\", "E:\"}),不提供任何驱动器状态信息。

  • 速度快,无 I/O,适合仅需盘符列表的场景(如填充下拉框)
  • 不检查是否存在或是否就绪,所以后续访问前仍需做 Directory.Exists()try/catch
  • 返回结果与 GetDrives()Name 字段基本一致,但不保证顺序,也不含驱动器类型信息

如果你只需要盘符字符串,且不关心是否可用,用它更简单;否则优先选 DriveInfo.GetDrives() 并做好健壮性处理。

真正容易被忽略的是:IsReady 不是布尔开关,而是访问状态快照——同一驱动器在两次调用间可能插入/弹出,所以生产代码里别缓存 IsReady == true 的结果去反复读取空间信息。

text=ZqhQzanResources