将RTF编辑为纯文本但无法再次打开它

时间:2011-09-01 17:23:02

标签: c# .net encoding stream rtf

我有一个要打开的RTF文件,替换字符串“TEMPLATE_Name”并保存。但保存后,文件无法再次正确打开。当我使用MS Word时,文件将打开并显示RTF原始代码而不是文本。

我担心我会破坏格式或编码,但我真的不知道如何:

        using (MemoryStream ms = new MemoryStream(1000))
        using (StreamWriter sw = new StreamWriter(ms,Encoding.UTF8))
        {
            using (Stream fsSource = new FileStream(Server.MapPath("~/LetterTemplates/TestTemplate.rtf"), FileMode.Open))
            using (StreamReader sr = new StreamReader(fsSource,Encoding.UTF8))
                while (!sr.EndOfStream)
                {
                    String line = sr.ReadLine();
                    line = line.Replace("TEMPLATE_Name", model.FirstName + " " + model.LastName);
                    sw.WriteLine(line);
                }

            ms.Position = 0;

            using (FileStream fs = new FileStream(Server.MapPath("~/LetterTemplates/test.rtf"), FileMode.Create))
                ms.CopyTo(fs);
        }

关于可能出现什么问题的任何想法?

感谢。

解决方案:@BrokenGlass指出的一个问题是,我没有冲洗流。另一种是编码。在RTF文件的第一行,我可以看到:

{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\

所以,即使不了解有关RTF的任何内容,我也将编码设置为代码页1252并且它可以工作:

        using (MemoryStream ms = new MemoryStream(1000))
        using (StreamWriter sw = new StreamWriter(ms,Encoding.GetEncoding(1252)))
        {
            using (Stream fsSource = new FileStream(Server.MapPath("~/LetterTemplates/TestTemplate.rtf"), FileMode.Open))
            using (StreamReader sr = new StreamReader(fsSource,Encoding.GetEncoding(1252)))
                while (!sr.EndOfStream)
                {
                    String line = sr.ReadLine();
                    line = line.Replace("TEMPLATE_Name", model.FirstName + " " + model.LastName);
                    sw.WriteLine(line);
                }

            sw.Flush();
            ms.Position = 0;

            using (FileStream fs = new FileStream(Server.MapPath("~/LetterTemplates/test.rtf"), FileMode.Create))
                ms.CopyTo(fs);
        }

1 个答案:

答案 0 :(得分:4)

StreamWriter正在缓冲内容 - 请确保在从内存流中读取之前调用sw.Flush()

StreamWriter.Flush()

  

清除当前编写器的所有缓冲区并导致任何缓冲数据   写入基础流。

根据评论进行修改:

更好替代方案@leppie提到重构代码以使用using块强制刷新,而不是明确地执行:

 using (MemoryStream ms = new MemoryStream(1000))
 {
   using (StreamWriter sw = new StreamWriter(ms,Encoding.UTF8))
   {
     //...
   }
   ms.Position = 0;
   //Write to file
 }

甚至更好替代,因为@Slaks指出直接写入文件而根本不使用内存流 - 除非你有其他原因这样做,这似乎是最直接的解决方案,它将简化您的代码并避免在内存中缓冲文件。