我正在逐行读取文件,并且希望能够通过调用method重新启动读取Rewind()。
如何操作我System.IO.StreamReader和/或其底层System.IO.FileStream以重新开始读取文件?
我有个聪明的主意,可以FileStream.Seek(long, SeekOffset)在文件中四处移动,但是包围起来没有任何效果System.IO.StreamReader。我可以Close()重新分配流和读者参考,但我希望有更好的方法。
Answers:
您需要像以前一样在流中进行搜索,然后DiscardBufferedData在上调用StreamReader。此处的文档:
编辑:添加代码示例:
Stream s = new MemoryStream();
StreamReader sr = new StreamReader(s);
// later... after we read stuff
s.Position = 0;
sr.DiscardBufferedData(); // reader now reading from position 0
public long ReadList(string fileName, Action<string> action,long position=0)
{
if (!File.Exists(fileName)) return 0;
using (var reader = new StreamReader(File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite),System.Text.Encoding.Unicode))
{
if (position > 0)reader.BaseStream.Position = position;
while (!reader.EndOfStream)
{
action(reader.ReadLine());
}
return reader.BaseStream.Position;
}
}
问题正在寻找某种StreamReader.Rewind()方法。您正在寻找StreamReader.BaseStream.Position = 0;将阅读器重新设置为开始的位置,以便可以再次阅读。
StreamReader sr = new StreamReader("H:/kate/rani.txt");
Console.WriteLine(sr.ReadToEnd());
sr.BaseStream.Position = 0;
Console.WriteLine("----------------------------------");
while (!sr.EndOfStream)
{
Console.WriteLine(sr.ReadLine());
}
public static void removeDuplicatedLinesBigFile2(string inFile, string outFile)
{
int counter1 = 0, counter2 = 0;
string line1, line2;
bool band = false;
// Read the file and display it line by line.
System.IO.StreamReader fileIN1 = new System.IO.StreamReader(inFile);
System.IO.StreamReader fileIN2 = new System.IO.StreamReader(inFile);
System.IO.StreamWriter fileOut = new System.IO.StreamWriter(outFile);
while ((line1 = fileIN1.ReadLine()) != null)
{
//band = false;
int counter = 0;
fileIN2.BaseStream.Position = 0;
fileIN2.DiscardBufferedData();
while ((line2 = fileIN2.ReadLine()) != null)
{
if (line1.Equals(line2))
counter++;
if (counter > 1)
break;
}
fileOut.WriteLine(line1);
counter1++;
}
fileIN1.Close();
fileIN2.Close();
Console.WriteLine("Total Text Rows Copied: {0}", counter1);
}