将文件光标向上移动?

时间:2012-01-07 12:15:59

标签: c# file-io streamreader

我用疯狂搜索了这个,我似乎无法找到任何关于这类特殊问题的参考资料。

我有一个带有文件的StreamReader对象,我想在文件中读取一定数量的行一定次数,但是,似乎没有办法移动将光标归档到文件中的某些位置。

(没有代码,因为我不知道如何写这样的东西)

3 个答案:

答案 0 :(得分:3)

你应该可以使用

myStreamReader.BaseStream.Position = desiredPosition;
myStreamReader.DiscardBufferedData();

将流移动到特定位置。

编辑:下一个问题是如何查找desiredPosition。由于您想要将位置移回通过文件,而不是前进,因此您可以在某个时刻读取每个位置。您需要在阅读行时跟踪流中的位置,并将位置存储在List<int> positions中。最初,列表应在零位置包含0。在处理线条时,将线条的长度加上换行符的大小添加到列表中。当你想回到k行时,positions[k]应该有你需要的位置。

例如,如果您的文件包含以下行,则您的编码每个字母使用一个字符,文件中的行分隔符为Windows样式\r\n

Quick
brown fox
jumps over lazy
dog

然后您的positions列表应该有{0, 7, 17, 34}请注意,我在每行上添加了2个分隔符字符。

P.S。这是一个丑陋的解决方案,不是吗?如果有任何安慰,你不是第一个碰到它的人。 Here is a somewhat obscene rant来自想在2007年解决类似问题的人。{/ p>

答案 1 :(得分:0)

Stream.Seek()MSDN docs)就是你所需要的,但这是文件中的绝对位置,并且没有换行概念。

我更喜欢将这些行读入一个集合内存,然后在加载下几行之前,根据需要在内存中迭代集合。实际上,除非你在谈论数据的gigglebytes,否则只需阅读stringList<string>个{{1}}个对象中的所有行,并根据需要执行任何操作。

答案 2 :(得分:0)

没有办法定位到一个确切的行...仅限于文件中的绝对或相对字节...如果您需要定位到一行,您需要自己实现 - 通过将文件加载到a string[](不推荐用于大文件!)或扫描文件并构建包含每行绝对位置的索引,以便稍后可以将该索引用于Seek到所需的行。