2011-12-24 4 views
1

스트림에 문제가 있습니다.이 코드는 TestFile.txt의 모든 행을 읽을 수 있지만 읽기가 끝나면 다시 읽은 다음 문자열 배열 (목록이 아님)에 넣고 싶습니다.하지만 파일이 이미 사용 중이라고 다시 시도하십시오. 스트림을 리셋하거나 sr.Close()와 같은 작업을 수행하기를 원합니다. 처음 읽으므로 Testfile.txt에 몇 줄이 있는지 계산하기 때문입니다.C#에서 스트림 문제 Q #

using (StreamReader sr = new StreamReader("TestFile.txt")) 
{ 
      string line; 
      while ((line = sr.ReadLine()) != null) 
      { 
        Console.WriteLine(line); 
      } 
} 

이미 while 루프를 넣으려고했는데 if (line == null) sr.Close()하지만 작동하지 않습니다.

+1

왜 두 번 파일 라인을 통해 루프? – Oded

+0

왜냐하면 얼마나 많은 줄이 있는지 알고 싶기 때문입니다. [] lines = new string [counter] – user1074030

+1

'List '을 사용할 수없는 이유는 무엇입니까? 그것은 가능한 _ 배열로 바뀔 수 있습니다. – Oded

답변

9

왜 그냥 List<string>로 읽고 그에서 배열을 구축? 또는 더 간단 여전히 단지 전화 File.ReadAllLines :

string[] lines = File.ReadAllLines("TestFile.txt"); 

당신이 기본이되는 스트림을 재설정하고 독자의 버퍼를 플러시 수 있지만, 나는 그렇게하지 않을 - 난 그냥 한 번 모두를 읽었다 당신은 크기를 알 필요가 없습니다.

(사실, 난 어쨌든 List<string> 대신 string[] (A)의 사용하려고 것 - 그들은 일반적으로 사용하는 것이 더 적절한 것 자세한 내용은 Eric Lippert's blog post on the subject를 참조하십시오.).

+1

나는 이것에 완전히 동의한다. 나는 Jon이 나를 펀치 (이 커뮤니티가 빠르다)에 이길 전에 실제로 아주 비슷한 것을 타이핑했다. – Codingo

+1

펀치에 Jon을 이겨 내기 위해 아침 일찍 일어나야합니다 : http://meta.stackexchange.com/questions/9134/jon-skeet-facts –

4

(예는 HttpWebResponse 클래스 스트림 것) 할 수없는 경우 당신은 당신이 ... 다음에 좋은 옵션은 MemoryStream에 스트림을 복사하는 것입니다 0

BaseStreamPosition 속성을 설정하여 그것을 할 수 있습니다 Position을 0으로 설정하고 스트림을 원하는만큼 다시 시작할 수 있습니다.

Stream s = new MemoryStream(); 
StreamReader sr = new StreamReader(s); 
// later... after we read stuff 
s.Position = 0;