在c#中我想访问文件的某一行来重写它而不改变其余部分。实际上是这样做的:
using (StreamWriter writer = new StreamWriter(myfile))
{
for (int currentLine = 1; currentLine <= lines.Length; ++currentLine)
{
if (currentLine == Linetoedit)
{
writer.WriteLine(stufftowrite);
return;
}
else
{
//do nothing
}
}
}
问题是该文件可能很大,这让我担心系统会因此而变慢。是否有任何解决方案可以更直接地避免循环和访问文件中的所需行?
答案 0 :(得分:0)
听起来,这是不可能的。您无法根据那里的字符随机跳转到某个位置,因此您必须先读取,直到找到要替换的行,从而进行循环。没有循环的唯一方法就是如果行长度相同,你会说&#34;我想要行号 x ,&#34;因此你想寻求x * [line length]
。这很简单,但也是一个相对有限的设置。
那就是说,如果您正在考虑更换一条线路,那么您可能不得不担心线路长度。你不能插入&#34;在流中,你只能选择一个起始位置并写出随后的字节。因此,如果您尝试将长度为40个字符的行替换为长度为60的行,则最终会将18个(60 - 40 - "\r\n".Length
)个字符写入下一行。
所以基本上这里有两种情况:
我想我也可以采用第三种方案,在这种情况下,您可以确保替换字符串的长度与原始字符串完全相同。然后你必须只循环到那一行。但这实际上只是上述两种情况的总和。
显然,有一些更好的方法(可以说)来执行这个功能。更简单的方法,至少。但是我没有给人留下你在这里要求的印象。
如果您真的非常渴望性能,并且如果文件以某种方式排序或索引,例如,您可以编写一个简单的二进制搜索来搜索文件。虽然这对于一个真正的大文件来说只会有一点点好处。
老实说,但是。除非你正在处理一个真正的大文件,&#34;看到这些花费了很多时间,我感到有些惊讶。如果您愿意,可能值得研究一下您的应用程序,以便您能够实现这一目标。 IO本来就很昂贵,因此很难像我们有时那样进行优化,所以你可能想要一个进度条或同等的东西来向你的用户显示正在发生的事情。
答案 1 :(得分:0)
您无法在文本文件中间插入行而无需重写文件的其余部分。 只有使用具有固定长度记录的二进制文件时才能进行覆盖。 它是磁盘存储的限制,它在内部以块的形式存储文件。
有关详细信息,请参阅以下讨论: Inserting text into file at specific offset using Win32 API