0

0

C#的DriveInfo类如何获取磁盘信息?

星降

星降

发布时间:2025-08-06 10:13:01

|

837人浏览过

|

来源于php中文网

原创

driveinfo类是c#中用于获取硬盘、u盘等驱动器信息的核心工具,通过driveinfo.getdrives()方法可获取系统中所有逻辑驱动器的driveinfo对象数组;2. 每个driveinfo对象提供name(驱动器名称)、drivetype(类型,如fixed、removable)、totalsize(总容量)、availablefreespace(可用空间)、totalfreespace(总空闲空间)、volumelabel(卷标)、driveformat(文件系统格式)以及isready(是否就绪)等关键属性;3. 使用时必须先检查isready属性,否则访问未就绪驱动器(如空光驱或已拔出u盘)会抛出ioexception;4. 常见异常包括unauthorizedaccessexception(权限不足)和ioexception(i/o错误),需通过try-catch进行捕获处理以确保程序健壮性;5. 网络驱动器可能存在访问延迟或不稳定问题,建议结合超时机制、重试逻辑或异步操作避免阻塞主线程;6. 高级应用场景包括磁盘空间监控、安装前空间预检、系统诊断工具开发,可结合阈值告警或用户提示提升体验;7. 在跨平台应用(.net core/.net 5+)中,driveinfo提供统一api,简化了不同操作系统下的磁盘信息获取逻辑;8. 对性能敏感的场景可考虑缓存driveinfo结果或在后台线程执行枚举操作,避免频繁调用带来的轻微开销。

C#的DriveInfo类如何获取磁盘信息?

在C#里,想摸清电脑里那些硬盘、U盘的底细?

DriveInfo
类就是你的得力助手。它提供了一种相当直接且高效的方式,让你能够枚举系统中的所有逻辑驱动器,并获取它们的状态、类型、容量以及可用空间等一系列关键信息。说白了,就是帮你把那些抽象的存储介质,具象化成你可以编程访问的数据对象。

解决方案

要获取磁盘信息,核心就是使用

System.IO.DriveInfo
类。它提供了一个静态方法
GetDrives()
,返回一个
DriveInfo
对象的数组,每个对象都代表系统中的一个逻辑驱动器。然后,你就可以遍历这个数组,访问每个驱动器的各种属性了。

using System;
using System.IO; // 别忘了这个命名空间

public class DiskInfoRetriever
{
    public static void Main(string[] args)
    {
        // 遍历系统中的所有逻辑驱动器
        foreach (DriveInfo drive in DriveInfo.GetDrives())
        {
            try
            {
                Console.WriteLine($"驱动器名称: {drive.Name}");
                Console.WriteLine($"驱动器类型: {drive.DriveType}");

                // 重点:在访问容量信息前,务必检查IsReady属性!
                // 否则,如果驱动器未准备好(比如光驱里没盘,或USB拔了),会抛异常。
                if (drive.IsReady)
                {
                    Console.WriteLine($"卷标: {drive.VolumeLabel}");
                    Console.WriteLine($"文件系统: {drive.DriveFormat}");
                    Console.WriteLine($"总大小: {drive.TotalSize / (1024.0 * 1024 * 1024):F2} GB");
                    Console.WriteLine($"可用空间: {drive.AvailableFreeSpace / (1024.0 * 1024 * 1024):F2} GB");
                    Console.WriteLine($"总空闲空间: {drive.TotalFreeSpace / (1024.0 * 1024 * 1024):F2} GB"); // 和AvailableFreeSpace略有不同
                }
                else
                {
                    Console.WriteLine("驱动器未准备好或无法访问。");
                }
            }
            catch (UnauthorizedAccessException)
            {
                Console.WriteLine($"权限不足,无法访问驱动器 {drive.Name} 的详细信息。");
            }
            catch (IOException ex)
            {
                Console.WriteLine($"访问驱动器 {drive.Name} 时发生I/O错误: {ex.Message}");
            }
            finally
            {
                Console.WriteLine("-----------------------------------");
            }
        }
    }
}

DriveInfo
能提供哪些关键的磁盘数据?

DriveInfo
这个类,它提供的属性其实相当丰富,远不止你一眼看到的那些。理解这些属性的含义,对于你构建更健壮的应用至关重要。

首先是

Name
,这个最直观,就是驱动器的名称,比如"C:\"、"D:\"或者网络路径。接着是
DriveType
,这是一个枚举类型,它会告诉你这个驱动器是固定硬盘(Fixed)、可移动设备(Removable,比如U盘)、光驱(CDRom)、网络驱动器(Network)、内存盘(Ram)还是未知类型(Unknown)。这个属性非常有用,你可以根据类型做不同的处理,比如对U盘进行特殊的扫描。

然后是几个关于空间的属性:

TotalSize
是驱动器的总容量,
AvailableFreeSpace
是当前用户可用的空闲空间,而
TotalFreeSpace
则是整个驱动器上总的空闲空间。这两者在某些文件系统或权限配置下可能会有细微差别,但大多数时候,对我们普通应用来说,
AvailableFreeSpace
更具实际参考价值,因为它代表了你当前能真正利用的空间。

VolumeLabel
是驱动器的卷标,就是你在文件管理器里看到的名字,比如"本地磁盘 (C:)"里的"本地磁盘"。
DriveFormat
则揭示了驱动器的文件系统格式,比如"NTFS"、"FAT32"或者"exFAT"。这对于需要特定文件系统支持的应用来说,非常重要。

最后,也是我个人觉得最关键的一个属性:

IsReady
。这个布尔值告诉你驱动器当前是否已经准备好,可以被访问。比如,如果光驱里没放光盘,或者U盘被拔掉了,
IsReady
就会是
false
。在访问任何关于容量或文件系统的属性之前,强烈建议先检查
IsReady
,否则你很可能会遇到
IOException
UnauthorizedAccessException
。这就像你去敲门前,总得先看看门是不是开着,对吧?

使用
DriveInfo
时常见的“坑”有哪些?

说实话,

DriveInfo
用起来是挺直接的,但有些地方,不留神就可能踩坑。我见过不少人,包括我自己,都曾在这上面栽过跟头。

最大的一个“坑”就是我前面反复强调的

IsReady
。如果你不检查
drive.IsReady
就去访问
drive.TotalSize
drive.VolumeLabel
这些属性,那么当遇到一个没有准备好的驱动器时(比如空光驱、脱机网络驱动器、或者突然拔掉的U盘),程序会毫不留情地抛出
IOException
。这就像你试图从一个不存在的抽屉里拿东西一样,肯定会出错。所以,养成习惯,凡是涉及到具体数据访问的,前面加个
if (drive.IsReady)
,能省去你很多调试的麻烦。

Thiings
Thiings

免费的拟物化图标库

下载

第二个常见问题是权限不足。在某些操作系统配置下,或者当你尝试访问一个受限的网络驱动器时,可能会遇到

UnauthorizedAccessException
。这通常意味着你的应用程序没有足够的权限去读取该驱动器的信息。解决办法通常是提升应用程序的运行权限(比如以管理员身份运行),或者确保你的网络共享权限设置正确。但这在实际部署中,可能需要你和IT管理员沟通,或者在设计时就考虑好权限降级处理。

再来就是网络驱动器的延迟和不稳定性。虽然

DriveInfo
也能识别网络驱动器,但由于网络环境的复杂性,访问这些驱动器的信息可能会有明显的延迟,甚至因为网络中断而导致访问失败。你的程序需要有足够的容错机制来处理这种情况,比如设置超时、重试逻辑,或者在UI上给用户友好的提示,而不是直接崩溃。我个人倾向于在处理网络驱动器时,额外考虑异步操作,避免阻塞主线程。

最后,虽然不是

DriveInfo
本身的“坑”,但值得一提的是错误处理。我上面代码里加了
try-catch
块,这真的不是为了好看。在生产环境中,你永远不知道用户会遇到什么奇奇怪怪的系统状态。一个健壮的应用程序,必须能够优雅地处理这些潜在的异常,而不是直接崩溃。捕获
UnauthorizedAccessException
IOException
是最低限度,这样即使出了问题,你的程序也能继续运行,并给出有用的反馈。

除了基本信息,
DriveInfo
在实际应用中还有哪些高级用法或考量?

DriveInfo
虽然看起来简单,但在实际应用中,它的用途可以很广泛,甚至能成为一些系统级工具的基础。

一个很常见的应用场景是磁盘空间监控。你可以定期(比如每隔几分钟或几小时)获取所有驱动器的可用空间,然后根据预设的阈值,如果某个驱动器的可用空间低于某个百分比(例如10%或20GB),就可以触发一个警报,比如发送邮件、弹窗提示,或者写入日志。这对于服务器运维、桌面应用的用户体验优化(比如提醒用户清理垃圾)都很有用。

另一个高级考量是应用安装或数据存储前的预检查。设想你的应用程序需要下载一个巨大的更新包,或者用户选择一个目录来保存大量数据。在执行这些操作之前,你可以用

DriveInfo
来检查目标驱动器是否有足够的可用空间。如果空间不足,你可以及时提示用户,避免下载或写入到一半才发现空间不够,导致操作失败或数据损坏。这能极大地提升用户体验和程序的健壮性。

此外,

DriveInfo
也是系统诊断和报告工具的重要组成部分。如果你在开发一个系统信息查看器或者故障诊断工具,
DriveInfo
可以帮你快速收集所有存储设备的概览信息。结合其他.NET类库(比如
ManagementObjectSearcher
来获取更底层的WMI信息),你可以构建出非常全面的系统健康报告。

再往深一点看,如果你在开发一个需要跨平台运行的应用程序(比如使用.NET Core/.NET 5+),

DriveInfo
的好处就更明显了。它提供了一致的API来获取驱动器信息,无论你的程序运行在Windows、Linux还是macOS上,你都可以用同样的代码逻辑来处理磁盘信息,这大大简化了跨平台开发的复杂性。当然,不同操作系统的某些细节行为可能略有差异,但核心功能是稳定的。

最后,考虑到性能,虽然

DriveInfo.GetDrives()
通常很快,但如果你在短时间内频繁调用,或者在遍历大量网络驱动器时,可能会带来一些微小的性能开销。在对性能有极致要求的场景下,可以考虑缓存结果,或者在后台线程异步执行这些操作,避免阻塞用户界面。但对于大多数桌面应用或服务来说,这通常不是一个瓶颈。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

757

2023.08.22

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

482

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

482

2023.08.10

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

641

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1124

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

796

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

452

2023.08.02

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2349

2023.08.08

AO3中文版入口地址大全
AO3中文版入口地址大全

本专题整合了AO3中文版入口地址大全,阅读专题下面的的文章了解更多详细内容。

1

2026.01.21

热门下载

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

精品课程

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

共48课时 | 7.6万人学习

Git 教程
Git 教程

共21课时 | 2.9万人学习

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

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