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
相关产品推荐
相关产品推荐

