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

C#保存软件设置:覆盖文件后残留原文件尾部内容的问题

解决C#保存设置文件时尾部残留原内容的问题

问题原因

你当前使用FileMode.OpenOrCreate打开文件,这个模式会保留原文件的长度——如果新写入的内容比原文件短,原文件末尾没被覆盖的部分就会残留下来。

解决方案

方案1:改用FileMode.Create模式(最直接)

FileMode.Create会直接创建新文件,若原文件存在则完全覆盖,从根源避免残留问题:

public void SaveToFile(string pathName)
{
    try
    {
        using (var sw = new StreamWriter(
            File.Open(
                pathName,
                FileMode.Create
        )))
        {
            var content = this.ToString();
            sw.Write(content);
            XXXSystem.Log(content);
        }
    }
    catch (Exception ex)
    {
        XXXSystem.Log("保存配置文件时出错: " + ex.ToString());
    }
}

方案2:手动截断文件长度(兼容OpenOrCreate场景)

如果必须保留OpenOrCreate模式(比如需要保留文件原有权限等属性),可以在写入后手动截断文件到当前写入位置:

public void SaveToFile(string pathName)
{
    try
    {
        using (var fs = File.Open(pathName, FileMode.OpenOrCreate))
        using (var sw = new StreamWriter(fs))
        {
            var content = this.ToString();
            sw.Write(content);
            sw.Flush(); // 确保所有写入内容都同步到文件流
            fs.SetLength(fs.Position); // 截断文件到当前写入位置
            XXXSystem.Log(content);
        }
    }
    catch (Exception ex)
    {
        XXXSystem.Log("保存配置文件时出错: " + ex.ToString());
    }
}

方案3:使用StreamWriter的简化重载

直接用StreamWriter的路径+覆盖参数重载,代码更简洁:

public void SaveToFile(string pathName)
{
    try
    {
        // 第二个参数传false表示覆盖现有文件
        using (var sw = new StreamWriter(pathName, false))
        {
            var content = this.ToString();
            sw.Write(content);
            XXXSystem.Log(content);
        }
    }
    catch (Exception ex)
    {
        XXXSystem.Log("保存配置文件时出错: " + ex.ToString());
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 11:42:32