2012-03-18 2 views
1

텍스트를 내 txt 파일에 쓰려고합니다. 첫 번째 후 것은닫힌 TextWriter에 쓸 수 없습니다.

내 목록은 브라우저가 열리는 링크가 포함되어 폐쇄 TextWriter에 쓸 수 없습니다 오류와 응용 프로그램 충돌을 작성하고 나는 로그처럼 (txt 파일에 모두 저장하려면).

내 코드 :

FileStream fs = new FileStream(
        "c:\\linksLog.txt", FileMode.Append, FileAccess.Write); 
StreamWriter sw = new StreamWriter(fs); 

for (int i = 0; i < linksList.Count; i++) 
{ 
    try 
    { 
     System.Diagnostics.Process.Start(browserType, linksList[i]); 
    } 
    catch (Exception) { } 

    using (sw) 
    { 
     sw.WriteLine(linksList[i]); 
     sw.Close(); 
    } 

    Thread.Sleep((int)delayTime); 

    if (!cbNewtab.Checked) 
    { 
     try 
     { 
      foreach (Process process in Process.GetProcesses()) 
      { 
       if (process.ProcessName == getProcesses) 
       { 
        process.Kill(); 
       } 
      } 
     } 
     catch (Exception) { } 
    } 
} 
+2

사용을 마칠 때까지 StreamWriter (sw)를 닫지 마십시오. –

+1

스트림을 올바르게 처리하려면 "사용"을 사용하십시오. – Bahamut

답변

10

당신이하는 for 루프에있어하지만, 첫 번째 반복에서 StreamWriter을 닫고 처분하십시오.

using (sw) 
{ 
    sw.WriteLine(linksList[i]); 
    sw.Close(); 
} 

대신, 그 블록을 제거하고 하나 개의 using 블록에 모든 것을 포장 :

using (sw) 

StreamWriter를 처분/종료

using (var fs = new StreamWriter(@"C:\linksLog.txt", true)) { 
    foreach (var link in linksList) { 
     try { 
      Process.Start(browserType, list);       
     } catch (Exception) {} 

     Thread.Sleep((int)delayTime); 

     if (!cbNewtab.Checked) { 
      var processes = Process.GetProcessesByName(getProcesses); 

      foreach (var process in processes) { 
       try { 
        process.Kill(); 
       } catch (Exception) {} 
      } 
     } 
    } 
} 
2
문제는 당신이 루프에서 스트리밍 폐쇄되어, 후에 만 ​​수행해야한다는 것입니다

...

FileStream fs = new FileStream("c:\\linksLog.txt", FileMode.Append, FileAccess.Write); 
StreamWriter sw = new StreamWriter(fs); 

    for (int i = 0; i < linksList.Count; i++) 
    { 
     try 
     { 
      System.Diagnostics.Process.Start(browserType, linksList[i]);       
     } 
     catch (Exception) 
     { 

     } 
     // Removed the using blocks that closes the stream and placed at the end of loop 
     sw.WriteLine(linksList[i]); 

     Thread.Sleep((int)delayTime); 

     if (!cbNewtab.Checked) 
     { 
      try 
      { 
       foreach (Process process in Process.GetProcesses()) 
       { 
        if (process.ProcessName == getProcesses) 
        { 
         process.Kill(); 
        } 
       } 
      } 
      catch (Exception) 
      { } 
     } 
    } 

    sw.Close(); 
1

라인입니다.

루핑 중이므로 이미 처분 한 StreamWriter을 처분하십시오.

모든 쓰기 작업이 완료된 후 StreamWriter외부의 루프를 닫는 것이 더 좋습니다.

또한 예외를 포착하고 예외를 무시하는 것은 거의 잘못된 생각입니다. 예외를 처리 할 수 ​​없으면 catch하지 마십시오.

1

사실 루프의 중간에 스트림이 닫혀 있기 때문입니다. 중간에 using (sw) 블록이 있습니다. 첫 번째 실행시에는 for 루프를 통해 정상적으로 작동하고 충돌이 발생합니다. 이 문제를 해결하려면, 단지 sw.Close() 전화를 드롭하고, for 루프 외부가되도록 using 이동 : 파일이 닫혀있는 경우 코드가 파일을 읽을 수 없기 때문에

+0

하지만 앱이 중간에 충돌하는 경우 어떻게해야합니까? – user1269592

+0

일반적으로'using' 호출은'try {} catch {} finally {sw.Dispose()} '로 변환 되더라도 모든 반복에서 데이터를 디스크에 기록하려면'sw.Flush());}'호출하면 예외를 던지더라도 스트림이 제대로 닫힙니다. –

+0

만약 내가 사용하고 싶다면 close()를 써야 하나? 내 코드에서 어디에서 사용할 수 있습니까? – user1269592

0

말라 코드에서 sw.Close() 물품.

+0

파일에있는 모든 링크를 계속 볼 수있는 방법이 있습니까? 나는 for 문 안에 아직도있는 동안 과정의 중간에 의미한다. – user1269592

관련 문제