StreamReader를 처음으로 반환
파일을 한 줄씩 읽고 있는데 메서드를 호출하여 읽기를 다시 시작할 수 있기를 원합니다 Rewind()
.
파일 읽기를 시작하기 위해 내 System.IO.StreamReader
및 / 또는 기본 System.IO.FileStream
을 조작하려면 어떻게 해야합니까?
FileStream.Seek(long, SeekOffset)
파일을 이동하는 데 사용할 영리한 아이디어를 얻었 지만 System.IO.StreamReader
. 나는 Close()
스트림과 독자 참조를 모두 재 할당 할 수 있지만 더 나은 방법이 있기를 바랍니다.
당신은 당신이 다음 전화처럼, 스트림에 추구해야 할 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
이 방법을 사용합니다.
System.IO.StreamReader reader = new System.IO.StreamReader("file.txt")
//end of reading
reader.DiscardBufferedData();
reader.BaseStream.Seek(0, System.IO.SeekOrigin.Begin);
Amy의 답변은 일부 파일에서 작동하지만 기본 스트림의 인코딩에 따라 예기치 않은 결과가 발생할 수 있습니다.
예를 들어 스트림이 UTF-8이고 프리앰블이있는 경우 StreamReader는이를 사용하여 인코딩을 감지 한 다음 인코딩을 감지하고 프리앰블을 확인하도록 지시하는 일부 내부 플래그를 끕니다. 스트림의 위치를 처음으로 재설정하면 스트림 리더는 이제 프리앰블을 다시 사용하지만 두 번째로 출력에 포함합니다. 이 인코딩 및 프리앰블 상태를 재설정하는 공용 메서드가 없으므로 스트림 리더를 "되감기"해야하는 경우 가장 안전한 방법은 표시된대로 기본 스트림을 시작 (또는 설정 위치)으로 찾고 새 StreamReader를 만드는 것입니다. StreamReader에서 DiscardBufferedData ()를 호출하는 것만으로는 충분하지 않습니다.
BaseStream
실제로 Position
속성을 0 으로 설정할 수 있으면 모두 좋습니다 .
할 수없는 경우 (예 : HttpWebResponse
스트림) 스트림을 복사하는 것이 좋습니다. 0으로 MemoryStream
설정 하고 원하는만큼 Position
다시 시작할 수 있습니다 Stream
.
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());
}
참고 URL : https://stackoverflow.com/questions/2053206/return-streamreader-to-beginning
'Program Tip' 카테고리의 다른 글
Docker : "매니페스트 목록 항목에 windows / amd64와 일치하는 매니페스트가 없습니다" (0) | 2020.11.19 |
---|---|
iPhone에서 TableView 구분 기호를 사용자 지정하는 방법 (0) | 2020.11.19 |
Linux에서 현재 rpath를 검사하는 방법이 있습니까? (0) | 2020.11.19 |
Android에서 수직 SeekBar를 만드는 방법은 무엇입니까? (0) | 2020.11.19 |
Internet Explorer의 addEventListener (0) | 2020.11.19 |