C#获取多硬盘信息仅返回C盘数据的技术求助
问题分析与修复方案:多硬盘HDD信息仅提取第一个驱动器的问题
嘿,我一眼就定位到问题了——你的CurrentDiskUsage()方法在遍历驱动器时,找到第一个就绪的驱动器后直接执行了return,这会立刻终止整个方法,后面的驱动器完全没机会被处理!另外catch块里的return也有问题,一旦某个驱动器抛出异常,方法直接返回"Fail",剩下的驱动器也不会被检查。
具体问题点拆解
- 在
foreach (DriveInfo drive in drives)循环中,只要找到第一个drive.IsReady为true的驱动器(通常就是C盘),就执行return driveInformation;,方法直接结束,后续循环迭代被跳过。 - catch块里的
return "Fail";会在单个驱动器出错时直接终止方法,导致其他正常驱动器的信息也无法获取。
修复后的代码方案
我们需要把所有符合条件的驱动器信息拼接起来,最后统一返回,而不是中途终止方法。同时用StringBuilder来优化字符串拼接的性能:
using System.Text; // 需要引入这个命名空间来使用StringBuilder public static string CurrentDiskUsage() { DriveInfo[] drives = DriveInfo.GetDrives(); StringBuilder driveInformation = new StringBuilder(); foreach (DriveInfo drive in drives) { try { if (drive.IsReady) { double result = 100 * (double) drive.TotalFreeSpace / drive.TotalSize; result = Math.Round(result, 2, MidpointRounding.AwayFromZero); // 逐个追加每个驱动器的信息 driveInformation.AppendLine(drive.Name); driveInformation.AppendLine(drive.DriveFormat); driveInformation.AppendLine($"Drive total size: {FormatBytes(drive.TotalSize)}"); driveInformation.AppendLine($"Drive total free space: {FormatBytes(drive.TotalFreeSpace)}"); driveInformation.AppendLine($"Free space as percentage: {result}%"); driveInformation.AppendLine(); // 用空行分隔不同驱动器,提升可读性 } } catch (Exception e) { // 记录异常但不终止方法,继续处理其他驱动器 Console.WriteLine($"获取驱动器{drive.Name}信息失败: {e.Message}"); driveInformation.AppendLine($"⚠️ 驱动器{drive.Name}信息获取失败: {e.Message}"); driveInformation.AppendLine(); } } // 如果没有任何有效信息,返回"Fail",否则返回拼接好的所有驱动器数据 return driveInformation.Length == 0 ? "Fail" : driveInformation.ToString(); }
关键修改说明
- 替换字符串拼接方式:用
StringBuilder代替直接的string +=,避免频繁创建字符串对象,提升性能(尤其是在多驱动器场景下)。 - 移除中途return:不再在循环内返回结果,而是把每个驱动器的信息都追加到结果容器中,遍历完所有驱动器后统一返回。
- 优化异常处理:单个驱动器出错时,仅记录异常并继续处理剩余驱动器,不会因为一个盘的问题导致整个方法失败。
- 空结果判断:最后检查是否有有效信息,避免返回空字符串,保持原有的"Fail"逻辑。
另外提个小细节:你的控制台输出代码里,Content数组长度是7,但循环条件是i < 6,会漏掉Content[6]的输出,如果这不是故意的,可以调整循环条件为i < Content.Length来遍历所有元素。
内容的提问来源于stack exchange,提问作者xjacksssss
相关产品推荐
相关产品推荐

