我有一个要打开的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);
}
答案 0 :(得分:4)
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指出直接写入文件而根本不使用内存流 - 除非你有其他原因这样做,这似乎是最直接的解决方案,它将简化您的代码并避免在内存中缓冲文件。