Файл используется другим процессом. Причина и решение?

2

Процесс не может получить доступ к файлу 'abc.log', потому что он используется другой процесс.

Привет, я видел это исключение из моего приложения occationaly, но я все еще пытаюсь это исправить, надеюсь, что я получу некоторое представление из stackoverflow.

В моем приложении я определил функцию WriteToLog, которая будет записывать в файл журнала. Также mainForm моего приложения запустит backgroundWorker выполнить некоторую работу, которая также вызывает WriteToLog. Может быть, два потока доступа к файлу вызовут проблему? Но в моем коде Я уже сделал все возможное, чтобы написать флеш и закрыть текстовый файл (я думаю), и вот мой код из WriteToLog:

 StreamWriter sw = null;
 string newText = "";
 try
 {
     //populate the content for newText
     sw = File.AppendText(LOG_FILE);
     sw.Write(newText);
     sw.Flush();
     sw.Close();
 }
 catch (IOException ex)
 {
     MessageBox.Show("Failed to write to log!\n\t" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
 }
 finally
 {
     if (sw != null)
     {
         sw.Close();
     }
 }

Я думаю, что до тех пор, пока я скрываю и закрываю streamWriter, я должен буду многократно писать WriteToLog и в многопотоках, не так ли? Или если я ошибаюсь, могу ли я сделать простой файл открытым, или есть другие причины/решения?

Теги:

3 ответа

1

Это, вероятно, не связано с вашей проблемой, но вы можете немного упростить этот код, используя оператор using с вашим StreamWriter вместо finally. Это также имеет дополнительное преимущество: не нужно явно вызывать Close или Flush (закрытие потока также сбрасывает его).

Я не пробовал компилировать это, но это должно быть что-то вроде:

string newText = "";
try
{
    //populate the content for newText
    using (StreamWriter sw = File.AppendText(LOG_FILE))
    {
        sw.Write(newText);
    }
}
catch (IOException ex)
{
    MessageBox.Show("Failed to write to log!\n\t" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
  • 0
    Спасибо, я сталкивался с использованием ранее, но не удосужился изменить свой код. Но подумайте еще раз, даже если это не должно изменить работу моего приложения, я изменил свой код на использование блока только для более ясного кода.
1

Нет; разные потоки, пытающиеся открыть файл в одно и то же время, будут мешать друг другу. Вы могли бы lock использовать общий object, чтобы заставить потоки запускать один за раз.

Или просто используйте встроенную функцию .NET tracing; вы можете настроить app.config для записи в файл.

  • 0
    Привет, если мое понимание верно, функциональность трассировки является средством отладки для .NET, и я могу использовать его для записи файла журнала?
  • 0
    Мне нужно повторно протестировать приложение, по-видимому, просто заблокировать LOG_FILE или вызвать extWriter.Synchronized (File.AppendText (filePath)); вместо sw = File.AppendText (LOG_FILE) не удалось решить проблему.
Показать ещё 1 комментарий
0

Если вы вызываете это из нескольких потоков, вы должны убедиться, что операции с файлом являются атомарными. Очень вероятно, что Thread A пройдет через AppendText и остановится, например. on Write, в этот момент Thread B получает запланированное задание и начинает писать тот же (теперь заблокированный) файл.

Один из способов справиться с этим - разместить область lock вокруг инструкций, представленных в вашем примере кода.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню