2010-01-12 6 views
53

파일을 한 줄씩 읽었으며 Rewind() 메서드를 호출하여 읽기를 다시 시작하려고합니다.StreamReader를 처음으로 돌아 가기

System.IO.StreamReader 및/또는 그 밑에있는 System.IO.FileStream을 파일 읽기와 함께 다시 시작하려면 어떻게해야합니까?

FileStream.Seek(long, SeekOffset)을 사용하여 파일을 옮기는 영리한 아이디어가 있지만 그 주위를 둘러싼 System.IO.StreamReader의 효과는 없습니다. 나는 Close() 일 수 있고 스트림과 독자 referecnes를 재 할당 할 수 있습니다. 그러나 나는 더 좋은 방법이 있기를 바라고 있습니다.

답변

93

스트림에서 검색해야하며 StreamReader에서 DiscardBufferedData으로 전화해야합니다. 문서 here :

편집 : 추가 코드 예제 : (예는 HttpWebResponse 스트림 될 수없는 경우 BaseStream 실제로 0

Position 속성을 설정할 수있는 경우 모든 좋은

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 
+4

하는 것은주의해야합니다. 자세한 내용은 내 대답을 참조하십시오. – Eamon

+0

당신은 using 절/IDisposable 패턴을 잊어 버리고 있습니다. StreamReader/Writer를 닫으면 기본 스트림을 닫음 (StreamReader/Writer 닫기) ... .NET 4.0을 처음 사용하는 경우 StreamReader (stream, Encoding.UTF8, true, 1024, true)와 새로운 StreamWriter (stream, Encoding.UTF8, 1024, true)가 깨졌습니다. 적어도 처음에는 M $이 항상 올바른 것은 아닙니다). 스트림에서 두 번 이상 읽어야하는 경우 두 개 이상의 StreamReader를 가지며 각각은 자신의 using 절 (서로 중첩되지 않음)에 있어야합니다. 마찬가지로 StreamWriter. 문서별로 DiscardBufferedData를 호출하는 것은 매우 드뭅니다. – TamusJRoyce

16

) 그러면 좋은 옵션은 스트림을 MemoryStream에 복사하는 것입니다. 여기에서 Position을 0으로 설정하고 Stream을 원하는만큼 다시 시작할 수 있습니다.

14

Amy의 대답은 일부 파일에서는 작동하지만 기본 스트림의 인코딩에 따라 예기치 않은 결과가 발생할 수 있습니다.

예를 들어 스트림이 UTF-8이고 프리앰블이있는 경우 StreamReader는이를 사용하여 인코딩을 검색 한 다음 인코딩을 감지하고 프리앰블을 확인하도록 지시하는 일부 내부 플래그를 해제합니다. 스트림의 위치를 ​​처음으로 재설정하면 스트림 판독기가 다시 프리 앰프를 사용하지만 두 번째로 출력에 포함됩니다. 이 인코딩과 프리앰블 상태를 재설정 할 공용 메서드가 없으므로 스트림 판독기를 "되감기"해야하는 경우 가장 안전한 방법은 그림과 같이 기본 스트림을 처음 (또는 설정된 위치)으로 검색하고 새 StreamReader를 만드는 것입니다. 단지 StreamReader에서 DiscardBufferedData()를 호출하는 것만으로는 충분하지 않습니다. 문제는 StreamReader.Rewind() 방법의 어떤 종류를 찾고 있습니다

System.IO.StreamReader reader = new System.IO.StreamReader("file.txt") 
//end of reading 
reader.DiscardBufferedData(); 
reader.BaseStream.Seek(0, System.IO.SeekOrigin.Begin); 
19

나는이 방법을 사용합니다. StreamReader.BaseStream.Position = 0;을 찾고 독자를 다시 처음으로 설정하여 다시 읽을 수있게합니다. (오히려 또는 인코딩 사전 앰블이있는 모든 파일) 간단한 ANSI 텍스트 파일이 아닌 모든 파일에서이 작업을 수행 할 때

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

:

+0

이것은 나에게 잘 맞지 않았다. 첫 번째 행을 읽은 다음 두 번째로 표시된 HTML 파일이 표시된 다음 제안 된 재설정이 사용되었습니다. 아마도 그것은 어떤 경우에는 작동하지만 내 경우에는 작동하지 않습니다. – JohnH

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

이 코드 조각이 질문에 설명 된 문제를 해결하는 이유에 대한 정보를 제공해주십시오. –