2012-03-18 3 views
1

Я пытаюсь записать текст в файл txt. После того, как первый писать аварии приложения с ошибкойНе удается написать закрытому TextWriter

Невозможно записать в закрытом TextWriter

Мой список содержит ссылки, браузер открывает и я хочу, чтобы сохранить их все в текстовом файле (например, журнал).

Мой код:

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 (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

Линия

using (sw) 

закрывает/располагает свой StreamWriter.

Поскольку вы зацикливаете, вы располагаете уже установленным StreamWriter.

Лучше закрыть StreamWriterснаружи цикл, после завершения всех операций записи.

Кроме того, перехватывание исключений и игнорирование пойманного исключения - это почти всегда плохая идея. Если вы не можете обработать исключение, не поймите его.

1

Это потому, что вы действительно закрываете свой поток в середине цикла. У вас есть блок using (sw) в середине, который отлично работает в первом прогоне через цикл for, а затем сбой. Чтобы исправить это, просто перенесите sw.Close() вызов, и переместить using быть вне цикла for:

+0

, но что делать, если приложение разбивается посередине? – user1269592

+0

Вы можете вызвать 'sw.Flush()', если вы хотите, чтобы данные записывались на диск на каждой итерации, хотя в общем случае вызов 'using' переводится в' try {} catch {} finally {sw.Dispose ();} 'call, поэтому, даже если вы создаете исключение, поток закрывается должным образом. –

+0

если я хочу использовать, мне нужно написать close()? где поставить использование в моем коде? – user1269592

0

Dont писать sw.Close() в коде, потому что, если файл закрыт код не может прочитать файл.

+0

есть способ, которым я могу продолжать видеть всю мою ссылку в файле? я имею в виду в середине процесса, пока я все еще в инструкции for – user1269592