C#程序每次启动无法在CSV换行写入SSD数据,求排查代码问题
问题分析与修正方案
你的代码无法实现追加CSV新行的核心问题出在文件写入逻辑上,以下是具体问题点和修正后的代码:
原代码的问题
- 文件写入模式错误:使用
FileMode.OpenOrCreate配合FileAccess.Write打开文件时,文件指针会定位到开头,每次执行都会覆盖原有内容,而不是追加到末尾。 - 未添加换行符:
writer.Write没有写入换行符,导致所有记录都挤在同一行,不符合CSV的格式要求。 - 冗余的控制台重定向:
Console.SetOut相关代码完全没用,既没有通过控制台输出内容到文件,反而增加了不必要的复杂度。 - 死循环阻塞程序:末尾的
while(true) { }会让程序无限挂起,定时执行场景下会导致后续任务无法正常运行。 - 多驱动器写入冲突:遍历所有就绪驱动器时,每个驱动器都会打开文件写入,前面的记录会被后面的覆盖,无法保留所有驱动器的空间数据。
修正后的代码
using System; using System.IO; namespace SSD { public class Program { static void Main(string[] args) { // 指定CSV文件路径 string csvPath = @"path.csv"; // 首次运行时写入表头(可选,根据需求调整) if (!File.Exists(csvPath)) { using (var writer = new StreamWriter(csvPath)) { writer.WriteLine("SSD剩余空间(GB),扫描时间"); } } DriveInfo[] allDrives = DriveInfo.GetDrives(); foreach (DriveInfo d in allDrives) { if (d.IsReady) { // 计算剩余空间,保留两位小数优化可读性(减10的逻辑按需保留) double availableFreeGB = Math.Round((d.AvailableFreeSpace / Math.Pow(10, 9)) - 10, 2); // 格式化时间,避免默认格式的逗号破坏CSV结构 string scanTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); // 直接追加到文件末尾,自动处理文件打开/关闭 using (var writer = File.AppendText(csvPath)) { writer.WriteLine($"{availableFreeGB},{scanTime}"); } } } Console.WriteLine("数据已成功写入CSV"); } } }
关键改动说明
- 使用
File.AppendText:该方法自动以追加模式打开文件,新内容直接写到末尾,不会覆盖原有数据。 - 添加换行符:用
writer.WriteLine替代Write,自动在每条记录后添加换行,保证每条数据占一行。 - 格式化DateTime:将时间格式化为
yyyy-MM-dd HH:mm:ss,避免默认格式中的逗号导致CSV列错乱。 - 移除冗余代码:删掉了无用的
Console.SetOut和死循环,让程序执行完成后正常退出,适配定时任务场景。 - 可选表头写入:首次运行时自动写入CSV表头,让数据结构更清晰(不需要可删除这段逻辑)。
- 优化空间计算:用
Math.Round保留两位小数,让输出的空间数值更易读。
内容的提问来源于stack exchange,提问作者arena nizar
相关产品推荐
相关产品推荐

