我用疯狂搜索了这个,我似乎无法找到任何关于这类特殊问题的参考资料。
我有一个带有文件的StreamReader
对象,我想在文件中读取一定数量的行一定次数,但是,似乎没有办法移动将光标归档到文件中的某些位置。
(没有代码,因为我不知道如何写这样的东西)
答案 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,否则只需阅读string
中List<string>
个{{1}}个对象中的所有行,并根据需要执行任何操作。
答案 2 :(得分:0)
没有办法定位到一个确切的行...仅限于文件中的绝对或相对字节...如果您需要定位到一行,您需要自己实现 - 通过将文件加载到a string[]
(不推荐用于大文件!)或扫描文件并构建包含每行绝对位置的索引,以便稍后可以将该索引用于Seek
到所需的行。