C# WPF开发中使用StreamReader删除CSV记录遇循环报错问题求解
问题排查与修复方案
核心错误点
- 你初始化了空的
lines列表后,没有任何将CSV文件内容读取到列表的操作,lines.Count永远为0,自然不会进入for循环分支 - 你修改循环条件为
i <= lines.Count后,空列表的lines.Count=0,i=0时进入循环访问lines[0],不存在对应索引元素,直接触发索引越界错误 - 现有代码中
StreamReader只打开了文件,没有执行ReadLine()读取操作,while (!reader.EndOfStream)会变成死循环卡住程序 - 就算完成了内存中列表的元素删除,也没有把修改后的内容写回源CSV文件,修改不会实际生效
修复后的代码示例
private void DeleteCategory(object sender, RoutedEventArgs e) { // 先校验用户输入不能为空,避免误删所有数据 string category = inputCategoryDelete.Text.Trim(); if (string.IsNullOrEmpty(category)) { // 此处可自定义添加输入为空的提示逻辑 return; } string filePath = @"C:\Users\ashle\OneDrive\Documents\Object Orientated Programming\Practise\CSV Files\animalcategory.csv"; try { // 读取CSV所有行到列表 List<string> lines = File.ReadAllLines(filePath).ToList(); // 移除所有匹配开头的行(如果需要精准匹配某列,可拆分后判断对应字段) lines.RemoveAll(line => line.StartsWith(category)); // 将修改后的内容写回CSV文件 File.WriteAllLines(filePath, lines); // 这里需要刷新你绑定DataGrid的数据源,让界面同步更新 // 比如你的数据源是categoryList的话,重新读取赋值后通知属性变更即可 } catch (IOException ex) { // 捕获文件被占用、无权限等IO异常,可自定义添加错误提示逻辑 Console.WriteLine($"操作失败:{ex.Message}"); } // 关闭弹窗 addCategoryPopup.IsOpen = false; }
额外注意事项
- 如果你的CSV有表头,要注意跳过表头行的匹配,避免把表头误删
- 建议不要写死绝对文件路径,后续换设备运行会找不到文件,可以用相对路径或者配置文件存储路径
- 如果CSV有多列,建议按分隔符(一般是逗号)拆分每行内容后匹配指定列,避免出现类别名和其他字段开头重复的误删情况
- 如果文件很大,再考虑用
StreamReader逐行读取写入临时文件,替换原文件的方式处理,小文件直接用File.ReadAllLines更简洁不易出错
内容的提问来源于stack exchange,提问作者ash1997
相关产品推荐
相关产品推荐

