保存并从选定行的文件加载?

时间:2012-06-02 08:04:10

标签: c#

我想知道是否可以在一个简单的文本文件中保存和加载数据到/从选定的行,就像ArrayList一样?

2 个答案:

答案 0 :(得分:2)

除非你的行都是相同的字节数(不仅仅是字符),否则一般情况下,如果在读取时没有读取相关行之前的整个文件,或者在写入时重写文件的其余部分,这是不可能的。您不能只从文件中间插入或删除字节。

如果你使用的是.NET 4,你可以很容易地在文件的第n行找到它:

string line = File.ReadLines("file.txt").ElementAt(lineNumber);

请注意,这需要阅读前面的所有文字。

替换一行是比较棘手的 - 最简单的方式(如果它是一个足够小的文件以适应内存)是将整个文件读入一个行数组,改变一条线,然后再把整个事情写出来:

string[] lines = File.ReadAllLines("file.txt");
lines[lineNumber] = replacementLine;
File.WriteAllLines("file.txt", lines);

有更有效的方法可以做到这一点,但它们要复杂得多。

答案 1 :(得分:0)

对于大多数情况,我支持Skeet对这个问题的回答。

对于性能要求证明所涉及的额外编程工作合理的特定情况,您可以使用类似于数据库的方法:维护索引结构,该结构指定文件中每行的偏移量。该索引只需要在开头创建一次,然后在任何文件修改后在内存中更新。它可以持久保存到磁盘以便随后运行您的应用程序。

以下是一些初始化索引的示例代码(未测试运行):

byte[] bytes = File.ReadAllBytes("source.txt");
var newlineIndexes = bytes.Select((byteValue, index) => new { byteValue, index })
                          .Where(p => p.byteValue == '\n' && 
                                      p.index < bytes.Length - 1)
                          .Select(p => p.index + 1);
var lineIndexes = (new int[] { 0 }).Concat(newlineIndexes).ToList();