2012-03-14 3 views
0

저는 몇 시간 동안 알아 내려고 노력 중이며 문제가 간단하다고 생각합니다.CheckedItems의 foreach 루프 내부에있는 StreamReader

다음은 코드입니다 (문제가 없으므로 여분의 쓰레기는 제거되었습니다).

foreach (String itemChecked in fightsList.CheckedItems) 
{ 
    try 
    { 
     Thread.Sleep(50); 
     using (StreamReader reader = new StreamReader(new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), Encoding.ASCII)) 
      { 
       while ((line = reader.ReadLine()) != null) 
        { 
         // do all stuff to lines here... 
        } 
      } 
    } 
    catch (Exception error) 
     { 
      errorText.Text = error.ToString(); 
     } 
} 
// foreach done here. 

나는에서는 StreamReader에서 명백한 텍스트 파일을 읽고,하지만하고, 그것은에서는 StreamReader를 실행하기 전에 두 번째 반복에 foreach 루프 롤을 실패하고 foreach 루프를 중지 할 때.

첫 루프가 잘 돌아갑니다.

'StreamReader reader = new'가 이미 존재하며 새 것을 만들 수 없기 때문에 문제가 있다고 생각합니까?

foreach는 문자열 checkedBox입니다. StreamReader는 루프의 모든 인스턴스에 대해 동일한 파일을 읽으며, 각 인스턴스마다 시작하고 중지 할 위치를 처리합니다. 내 오류 잡기 아무것도 얻지 않으며 응용 프로그램이 충돌하지 않습니다.

+3

받은 오류 메시지는 무엇입니까? – Jetti

+0

오류 메시지가 표시되지 않습니다. 그것은 일종의 문제입니다. 정상적으로 실행되고 두 번째 반복을 실행 한 다음 foreach 아래로 떨어지고 foreach가 완료된 것처럼 정상적으로 코드가 실행됩니다. 그러나 두 번째 실행 중에 foreach 내부에서 StreamReader 위의 코드가 실행됩니다. 어쩌면 다른 오류를 잡기 위해 더 많은 코드를 추가해야할까요? – user1270029

+1

fightsList가 무엇인지 말씀해 주시겠습니까? 목록 상자 또는? – Steve

답변

0

게시 한 코드에 문제가 없습니다. 파일 스트림을 별도의 단계로 할당하고 StreamReader에 전달하는 줄에 중단 점을 넣는 것이 좋습니다. 두 번째 단계에서 모든 내용 (파일 이름, 길이 등)이 기본 스트림에서 문제없이 루프의 내부에 있는지 확인합니다. 그렇지 않으면 코드의 다른 부분에 있습니다.

이 비싼 작업 (파일 IO)가 가능한 몇 번 일어날 수 있도록하기 때문에

using(StreamReader reader = new StreamReader(new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), Encoding.ASCII)){ 
    while ((line = reader.ReadLine()) != null) 
    { 
     foreach (String itemChecked in fightsList.CheckedItems) 
     { 
     } 
    } 
} 

같은 코드를 재구성 떨어져 당신도 더 나은,하지만이 특정 문제가 발생하는하지 이유입니다.

2

나는 당신이 루프를 통해 반복 할 때마다 동일한 파일을 읽는 것을 계속한다는 점에서 논리적 인 문제가 있다고 생각한다. 각 루프 이후에 동일한 파일에서 읽으려는 경우 외부 for 루프 외부에서 스트림 판독기를 한 번만 만들어야합니다. 또한 파일을 닫지 않으므로 첫 번째 반복 이후 파일 끝 부분에 문제가 발생할 수 있습니다. 그게 처음에만 작동하는 이유를 설명 할 것입니다

+1

"using"은 파일을 자동으로 처리하므로 문제는 아닌 것 같습니다. –

+0

그래서 모든 코드를 망칠 필요없이 파일 시작 부분의 StreamReader 위치를 처음부터 다시 설정해야합니다. – user1270029

+1

죄송 합니다만, 이것은 완전히 사실이 아닙니다. 스트림은'using' 문에서 사용되며 using 문 다음에 닫아야합니다. – GETah