[英]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()
。
清除当前编写器的所有缓冲区,并将所有缓冲的数据写入基础流。
根据评论编辑:
@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.