0

0

C#怎么获取驱动器列表_C#如何列出电脑上所有的磁盘分区【代码】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-03-15 16:52:03

|

187人浏览过

|

来源于php中文网

原创

DriveInfo.GetDrives() 是获取系统所有逻辑驱动器最轻量、跨平台且可靠的方式,返回 DriveInfo 数组,需用 try/catch 处理 IsReady 等属性访问异常,不可依赖盘符范围或 Environment.GetLogicalDrives()。

c#怎么获取驱动器列表_c#如何列出电脑上所有的磁盘分区【代码】

怎么用 DriveInfo.GetDrives() 获取所有驱动器

直接调用 DriveInfo.GetDrives() 就能拿到当前系统所有逻辑驱动器(包括未格式化、无盘符或不可访问的),这是最轻量也最可靠的方式。它不依赖 Windows API 或外部命令,跨 .NET Framework / .NET Core / .NET 5+ 都可用。

常见错误是只遍历 C:Z: 字母表——这会漏掉动态挂载的卷、RAM 磁盘、iSCSI 目标、甚至某些 USB 设备分配的非字母盘符(比如 WSL2 的 \?Volume{...})。

  • 必须用 try/catch 包裹 drive.IsReady 访问,否则遇到光驱空仓、拔掉的 U 盘会抛 IOException
  • DriveType 比盘符更可信:DriveType.Removable 可能是 U 盘或 SD 卡,DriveType.Fixed 才大概率是 SSD/HDD 分区
  • 返回数组顺序不保证稳定,不要假设索引 0 是 C:;需按 drive.Namedrive.DriveType 过滤
var drives = DriveInfo.GetDrives();
foreach (var drive in drives)
{
    try
    {
        Console.WriteLine($"{drive.Name} [{drive.DriveType}] {(drive.IsReady ? $"({drive.TotalSize / 1024 / 1024} MB)" : "not ready")}");
    }
    catch (IOException)
    {
        Console.WriteLine($"{drive.Name} [access denied or unavailable]");
    }
}

为什么 Environment.GetLogicalDrives() 不够用

Environment.GetLogicalDrives() 只返回字符串数组(如 "C:\", "D:\"),没有类型、状态、容量等元信息。它本质是读注册表 HKEY_LOCAL_MACHINESYSTEMMountedDevices 的快照,但跳过了权限校验和设备就绪检查。

典型坑点:GetLogicalDrives() 会列出已断开的网络驱动器映射(比如断网后仍显示 Z:),也会漏掉未分配盘符的 NTFS 卷(可通过磁盘管理“装入到以下 NTFS 文件夹”挂载)。

  • 不能判断驱动器是否实际可用,IsReadyTotalSize 等字段全不可用
  • 返回值不含 DriveType,无法区分 SSD、U 盘、CD-ROM 或 RAM 磁盘
  • 在容器或受限沙箱环境里,可能因权限不足返回空数组,而 DriveInfo.GetDrives() 至少能返回路径结构

处理权限不足和访问拒绝的现实情况

Windows 上很多卷(如系统保留分区、BitLocker 加密卷、其他用户配置的加密容器)即使存在,.NET 也无法读取其属性。此时 DriveInfo 实例仍可构造成功,但访问 IsReadyTotalFreeSpace 等属性会直接抛异常。

In3D
In3D

把真人变成化身,创建逼真且可自定义的虚拟角色

下载

关键不是“避开异常”,而是接受异常是常态。不要试图提前用 FileIOPermission 检查——它早已被弃用且无效;也不要靠 Directory.Exists(drive.RootDirectory.FullName) 判断,这在 NTFS 卷挂载点下可能返回 false 却实际可访问。

  • 每个属性访问都独立捕获 UnauthorizedAccessExceptionIOException
  • drive.DriveType == DriveType.Unknown 当作信号:该卷存在但系统无法识别类型,通常意味着驱动缺失或权限锁死
  • RootDirectory 调用 GetFiles()GetDirectories() 前,先确保 IsReadytrue,否则毫无意义

需要真实物理磁盘信息?别用 DriveInfo

DriveInfo 天然面向“逻辑卷”,而非物理磁盘。它无法告诉你 C: 和 D: 是否在同一块 SSD 上,也不能列出 NVMe 控制器下的多个命名空间(Namespace)。

如果真要查物理拓扑(比如做磁盘健康监控、识别 RAID 成员盘),得绕道 WMI:Win32_DiskDrive + Win32_Volume 关联,或用 ManagementObjectSearcher 查询。但注意:WMI 在 Nano Server、WSL2、部分容器里默认不可用,且性能比 DriveInfo.GetDrives() 差一个数量级。

  • DriveInfoName"C:\",而 Win32_DiskDriveDeviceID"\\.\PHYSICALDRIVE0",二者无直接映射关系
  • 必须用 ASSOCIATORS OF WQL 查询才能把卷和物理盘连起来,代码复杂度陡增
  • 普通应用完全不需要这层,除非你在写磁盘工具或备份软件
.NET 的驱动器枚举机制本身很干净,但 Windows 底层的卷管理太灵活——挂载点、符号链接、存储池、ReFS 卷、脱机状态……这些都会让“列出所有磁盘分区”变成一个语义模糊的问题。你得先想清楚:要的是用户能看到的盘符?还是系统能识别的所有块设备?抑或是能安全读写的活跃卷?选错起点,后面全是坑。

相关文章

驱动精灵
驱动精灵

驱动精灵基于驱动之家十余年的专业数据积累,驱动支持度高,已经为数亿用户解决了各种电脑驱动问题、系统故障,是目前有效的驱动软件,有需要的小伙伴快来保存下载体验吧!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

761

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1570

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

651

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

1229

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

1205

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

193

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

131

2025.08.07

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

69

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.4万人学习

C 教程
C 教程

共75课时 | 5.5万人学习

C++教程
C++教程

共115课时 | 22万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号