WPF Richtextbox修改内容后无法完整保存至原TXT文件求助
WPF RichTextBox 保存内容不完整问题解决
我已经实现将本地TXT文件内容加载至WPF Richtextbox中,代码如下:
string okunanmetin; string Progfilepath; private void btnSelect_Click(object sender, RoutedEventArgs e) { richtextboxEdit.Document.Blocks.Remove(richtextboxEdit.Document.Blocks.ElementAt(0)); Progfilepath = "C:/Users/SC/Desktop/test.txt"; okunanmetin = File.ReadAllText(Progfilepath); richtextboxEdit.Document.Blocks.Add(new Paragraph(new Run(okunanmetin))); }
修改文本后尝试保存回原文件,但点击保存按钮后仅能保存部分修改内容,无法完整保存全部更改,我的保存代码如下:
private void btnSave_Click(object sender, RoutedEventArgs e) { LoadXamlPackage( "C:/Users/SC/Desktop/test.txt"); } void LoadXamlPackage(string _fileName) { TextRange range; FileStream fStream; if (File.Exists(_fileName)) { range = new TextRange(richtextboxEdit.Document.ContentStart, richtextboxEdit.Document.ContentEnd); fStream = new FileStream(_fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite); range.Save(fStream, DataFormats.Text); fStream.Close(); } }
问题原因
核心问题在文件流的模式选择上:
- 使用
FileMode.OpenOrCreate时,若文件已存在,会保留原文件的长度。如果新内容比原文件短,原文件末尾的旧内容会残留;即使新内容更长,这种模式也不是针对“完全覆盖保存”的最优选择。 - 直接调用
fStream.Close()未确保资源被正确释放,存在潜在的流操作异常风险。
解决方案
修改保存逻辑,确保完全覆盖原文件并正确管理流资源:
private void btnSave_Click(object sender, RoutedEventArgs e) { SaveTextToFile("C:/Users/SC/Desktop/test.txt"); } void SaveTextToFile(string _fileName) { if (File.Exists(_fileName)) { var range = new TextRange(richtextboxEdit.Document.ContentStart, richtextboxEdit.Document.ContentEnd); // 使用using自动管理流生命周期,FileMode.Create直接覆盖原文件 using (var fStream = new FileStream(_fileName, FileMode.Create, FileAccess.Write)) { range.Save(fStream, DataFormats.Text); } } }
可选优化(加载代码)
原加载代码中直接移除索引为0的Block存在风险,可改为清空所有内容再添加:
private void btnSelect_Click(object sender, RoutedEventArgs e) { Progfilepath = "C:/Users/SC/Desktop/test.txt"; okunanmetin = File.ReadAllText(Progfilepath); richtextboxEdit.Document.Blocks.Clear(); richtextboxEdit.Document.Blocks.Add(new Paragraph(new Run(okunanmetin))); }
内容的提问来源于stack exchange,提问作者Samed ÇETİN
相关产品推荐
相关产品推荐

