繁体   English   中英

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

[英]Edit RTF as plain text but unable to open it again

我有一个我要打开的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);
        }

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指出一个更好的选择是直接写入文件而根本不使用内存流 - 除非你有其他原因这样做,这似乎是最直接的解决方案,它会简化你的代码并避免缓冲内存中的文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM