У меня есть объект TraceListener
, используемый для ведения журнала, созданный в app.config, который указывает на местоположение на USB-накопителе.
Я получаю IOException
с сообщением
Объем файла был изменен извне, поэтому открытый файл больше недействителен.
при попытке Trace.WriteLine()
после того, как я удалил устройство, а затем снова подключил его. Я понимаю, что это происходит, потому что дескриптор открытого файла, который есть у прослушивателя Trace, становится недействительным, когда я отключаю его.
Мне удалось помешать IOException
, вызвав Close()
в TraceListener, но я не могу понять, как снова открыть дескриптор того же файла. В документации MSDN для метода TextWriterTraceListener.Close()
говорится
Вызов метода Write или WriteLine после вызова Close автоматически повторно открывает поток.
Но он просто не делает этого. Я не получаю дальнейший вывод после закрытия потока.
ИЗМЕНИТЬ:
Еще немного информации
Я обнаружил, что прослушиватель трассировки не может снова записать только в том случае, если после вызова Close()
я попытаюсь записать, когда диск отключен от сети. Если я не пишу, когда диск отключен, снова подключите диск и попробуйте записать, все работает нормально. Я также проверил, что моя коллекция Trace.Listeners
все еще содержит мой слушатель.
EnsureWriter
очищает имя файла, если создание потока завершается неудачно, и возвращает false, что делает метод строки записи недействительным. Последующие вызовы SureWriter сначала проверяют, пусто ли имя файла, и если да, то пропускают создание потока. Боюсь, вам придется создать собственный модуль записи, который более изящно обрабатывает удаление и повторное появление устройств. - person rene   schedule 23.03.2014Trace.Refresh()
в MSDN (msdn.microsoft.com/en-us/library/), который я успешно тестировал последние несколько часов. Я не уверен на 100%, что это то решение, которое мне нужно, но оно выглядит многообещающе. - person Brandon   schedule 24.03.2014