Ich lese eine Datei zeilenweise und möchte den Lesevorgang durch Aufrufen einer Methode neu starten können Rewind()
.
Wie kann ich meine System.IO.StreamReader
und / oder die zugrunde liegende System.IO.FileStream
Datei manipulieren , um mit dem Lesen der Datei zu beginnen?
Ich hatte die clevere Idee, FileStream.Seek(long, SeekOffset)
mich in der Datei zu bewegen, aber das Einschließen hat keine Auswirkung System.IO.StreamReader
. Ich könnte Close()
sowohl den Stream als auch die Leserreferenzen neu zuweisen, aber ich hoffe, es gibt einen besseren Weg.
Ich benutze diese Methode:
System.IO.StreamReader reader = new System.IO.StreamReader("file.txt") //end of reading reader.DiscardBufferedData(); reader.BaseStream.Seek(0, System.IO.SeekOrigin.Begin);
quelle
Amys Antwort funktioniert bei einigen Dateien, aber abhängig von der Codierung des zugrunde liegenden Streams erhalten Sie möglicherweise unerwartete Ergebnisse.
Wenn der Stream beispielsweise UTF-8 ist und eine Präambel hat, verwendet der StreamReader diese, um die Codierung zu erkennen, und schaltet dann einige interne Flags aus, die ihn anweisen, die Codierung zu erkennen und die Präambel zu überprüfen. Wenn Sie die Position des Streams auf den Anfang zurücksetzen, verwendet der Stream-Reader die Präambel jetzt wieder, nimmt sie jedoch beim zweiten Mal in die Ausgabe auf. Es gibt keine öffentlichen Methoden zum Zurücksetzen dieses Codierungs- und Präambelstatus. Wenn Sie einen Stream-Reader "zurückspulen" müssen, ist es am sichersten, den zugrunde liegenden Stream wie gezeigt an den Anfang zu suchen (oder die Position festzulegen) und einen neuen StreamReader zu erstellen. Es reicht nicht aus, nur DiscardBufferedData () im StreamReader aufzurufen.
quelle
Dies ist alles gut, wenn die Eigenschaft
BaseStream
tatsächlichPosition
auf 0 gesetzt werden kann.Wenn Sie dies nicht können (Beispiel wäre ein
HttpWebResponse
Stream), ist es eine gute Option, den Stream in einenMemoryStream
... zu kopieren. Dort können SiePosition
auf 0 setzen und den StreamStream
so oft neu starten, wie Sie möchten.quelle
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; } }
quelle
Die Frage ist nach einer
StreamReader.Rewind()
Methode. Sie suchen,StreamReader.BaseStream.Position = 0;
was den Leser zum Anfang zurücksetzt, damit er wieder gelesen werden kann.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()); }
quelle
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); }
quelle