You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fish Finder控制台程序:删除渔获记录后文件无法保存修改求助

问题根源与修复方案

先直接点出核心问题:你的文件写入逻辑没有彻底覆盖旧文件内容,导致删除后的旧记录残留在文件末尾,重启程序后又被读回来了。

1. 为什么删除操作无法持久化?

看你的StorageManager.Write()方法,你使用了FileMode.OpenOrCreate:

FileStream stream = new FileStream("FishFinderData.txt", FileMode.OpenOrCreate, FileAccess.Write);

这个模式的坑在于:如果文件已经存在,它只会打开现有文件,但不会清空原内容。举个例子:原来文件有5条记录,你删除1条后写入4条新数据,那文件里前4条是更新后的内容,第5条旧记录会一直留在文件末尾!程序重启读取时,自然会把这条残留的旧数据当成有效记录加载。

2. 分步修复方案

第一步:替换FileMode,彻底覆盖旧文件

把FileMode.OpenOrCreate换成FileMode.Create,这个模式会直接创建新文件(如果文件已存在就完全覆盖),从根源上避免旧内容残留:

public void Write() {
    // 用Create模式替代OpenOrCreate,自动清空并覆盖旧文件
    using (FileStream stream = new FileStream("FishFinderData.txt", FileMode.Create, FileAccess.Write))
    using (StreamWriter fileWriter = new StreamWriter(stream)) {
        foreach (var d in data) {
            fileWriter.WriteLine($"{d.HourOfDay},{d.Location},{d.Species},{d.Bait}");
        }
    } // using块会自动关闭流,不需要手动调用Close(),异常场景也能保证资源释放
}

这里顺便用了using语句,比手动调用Close()更可靠——就算写入过程中抛出异常,也能确保文件流被正确关闭,避免文件损坏。

第二步:优化Send方法的引用问题

你的Send()方法里直接赋值storageManager.Data = catches,虽然先调用了Clear(),但List是引用类型,这会让storageManager.Data和Journal.catches指向同一个内存集合,后续如果其中一个被修改,另一个也会跟着变,可能引发意外的同步问题。改成用AddRange复制元素:

public void Send() {
    storageManager.Data.Clear();
    // 复制集合元素,而不是直接赋值引用
    storageManager.Data.AddRange(catches);
}

3. 额外优化建议

  • 给用户输入加个验证逻辑,避免非数字输入导致程序崩溃:
int choice;
while (!int.TryParse(Console.ReadLine(), out choice) || choice < 0 || choice > catches.Count) {
    Console.WriteLine("Invalid input. Please enter a valid number (0 to cancel):");
}
  • 可以在写入文件后加个简单校验:读取文件内容和内存中的List对比,确保写入的内容和预期一致。

这样修改后,删除记录再重启程序,被删的内容就不会再出现了。

内容的提问来源于stack exchange,提问作者Parker Weicks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:53:20