将StreamReader返回到Beginning

时间:2010-01-12 23:19:20

标签: c# .net

我正在逐行读取文件,我希望能够通过调用方法Rewind()重启读取。

我如何操纵我的System.IO.StreamReader和/或其基础System.IO.FileStream以重新阅读文件?

我明智地使用FileStream.Seek(long, SeekOffset)来移动文件,但它对封闭的System.IO.StreamReader没有影响。我可以Close()并重新分配流和读者引用,但我希望有更好的方法。

8 个答案:

答案 0 :(得分:101)

您需要像在线上一样在广告联盟中进行搜索,然后在DiscardBufferedData上致电StreamReader。文档here

编辑:添加代码示例:

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

答案 1 :(得分:28)

我使用这种方法:

char[]

答案 2 :(得分:18)

Amy的答案将适用于某些文件,但根据基础流的编码,您可能会得到意想不到的结果。

例如,如果流是UTF-8并且具有前导码,则StreamReader将使用它来检测编码,然后关闭一些内部标志,告诉它检测编码并检查前导码。如果您将流的位置重置为开头,则流阅读器现在将再次使用前导码,但它将在第二次将其包含在输出中。没有公共方法可以重置此编码和前导码状态,因此如果您需要"倒带"则最安全的做法是流读取器是如图所示寻找底层流到开头(或设置位置)并创建一个新的StreamReader,只是在StreamReader上调用DiscardBufferedData()是不够的。

答案 3 :(得分:17)

如果BaseStream实际上可以将Position属性设置为0,这一切都很好。

如果你不能(例子是HttpWebResponse流)那么一个好的选择是将流复制到MemoryStream ...你可以将Position设置为0并且尽可能多地重启Stream

答案 4 :(得分:1)

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;
   }
}

答案 5 :(得分:1)

我创建了一个简单的方法,您可以使用它来重置 StreamReader。

using (var reader = StreamReader(filePath))
{
   reader.ReadLine();
   reader.ReadLine();
   ResetReader(reader);
}


private static void ResetReader(StreamReader reader)

 {
     reader.DiscardBufferedData();
     reader.BaseStream.Seek(0, SeekOrigin.Begin);
 }

答案 6 :(得分:0)

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);
}

答案 7 :(得分:-1)

问题是寻找某种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());
}