Невозможно записать в закрытый TextWriter - PullRequest
2 голосов
/ 18 марта 2012

Я пытаюсь записать текст в мой текстовый файл.После первой записи сбой приложения с ошибкой

Невозможно выполнить запись в закрытый 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) { }
    }
}

Ответы [ 5 ]

12 голосов
/ 18 марта 2012

Вы находитесь в цикле 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 голосов
/ 18 марта 2012

Проблема в том, что вы закрываете свой поток в цикле, должно быть сделано только после ...

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 голос
/ 18 марта 2012

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

1 голос
/ 18 марта 2012

Линия

using (sw)

закрывает / удаляет ваш StreamWriter.

Поскольку вы зацикливаетесь, вы избавляетесь от уже удаленного StreamWriter.

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

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

0 голосов
/ 18 марта 2012

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

...