我目前正在尝试读取文件,修改一些占位符,然后将文件写入输出流。作为aspx.net中页面响应的输出流,我在那里使用OutputStream.Write方法(文件最后是一个附件)。
原来我有:
using (FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
while (readBytes < fs.Length)
{
tmpReadBytes = fs.Read(bytes, 0, bytes.Length);
if (tmpReadBytes > 0)
{
readBytes += tmpReadBytes;
page.Response.OutputStream.Write(bytes, 0, tmpReadBytes);
}
}
}
在考虑完之后我想出了以下内容:
foreach(string line in File.ReadLines(filename))
{
string modifiedLine = line.Replace("#PlaceHolder#", "NewValue");
byte[] modifiedByteArray = System.Text.Encoding.UTF8.GetBytes(modifiedLine);
page.Response.OutputStream.Write(modifiedByteArray, 0, modifiedByteArray.length);
}
但它看起来效率低下,特别是对于转换。所以我的问题是:有没有更好的方法呢?
请注意,文件本身不是很大,它是一个大约3-4 KB大小的文本文件。
答案 0 :(得分:2)
您不需要处理自己的字节。
如果你知道文件是,并且总是很小,
this.Response.Write(File.ReadAllText("path").Replace("old", "new"));
,否则
using (var stream = new FileStream("path", FileMode.Open))
{
using (var streamReader = new StreamReader(stream))
{
while (streamReader.Peek() != -1)
{
this.Response.Write(streamReader.ReadLine().Replace("old", "new"));
}
}
}
答案 1 :(得分:0)
获取字符串数组中的行:
string[] lines = File.ReadAllLines(file);
要改变线条,请使用循环。
for (int i = 0; i < lines.Length; i++)
{
lines[i] = lines[i].Replace("#PlaceHolder#", "NewValue");
}
要保存新文本,首先要创建一个包含所有行的字符串。
string output = "";
foreach(string line in lines)
{
output+="\n"+line;
}
然后将字符串保存到文件中。
File.WriteAllText(文件,输出);