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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 03:35:29