.NET - TextWriterTraceListener, файл используется другим процессом - PullRequest
7 голосов
/ 25 мая 2011

Я создаю прослушиватель трассировки следующим образом:

// Setup log tracing.

Trace.Listeners.Add(new TextWriterTraceListener(MyLogPath));
Trace.AutoFlush = true;
Trace.WriteLine(DateTime.Now.ToString() + "-" + " Program started");

Когда я обнаруживаю, что файл слишком велик, я хочу его усечь (или, скорее, взять только последние N строк),Чтобы сделать это, я хочу прочитать файл, но, кажется, что независимо от того, что я делаю, у слушателя трассировки есть блокировка, то есть при попытке удалить слушателя трассировки и избавиться от его потока следующим образом:

// Clear logging.

Trace.Listeners[0].Close();
Trace.Listeners[0].Dispose();                     
Trace.Listeners.Clear();

, перед тем как прочитать это следующим образом:

// Read in existing log.

string[] lines = File.ReadAllLines(MyLogPath);

, выдаёт мне исключение ввода-вывода (файл используется другим процессом).

Есть мысли?

1 Ответ

4 голосов
/ 25 мая 2011

Ну, причина, по которой вы не можете открыть файл после его открытия с помощью TraceWriter, заключается в том, что он открывает его с общим режимом «Чтение» (для Process Monitor). Этот режим совместного использования означает, что вы не можете повторно открыть его (создать новый дескриптор) с доступом для записи.

Однако закрытие TraceListener делает закрытием основного потока. Возможно, проблема в том, что вы закрываете не того слушателя.

Не забывайте, что всегда существует DefaultTraceListener, созданный при запуске процесса, если вы явно не удалили его.

Таким образом, правильная версия вашего кода должна быть:

Trace.Listeners[1].Close();
Trace.Listeners[1].Dispose();
Trace.Listeners.Clear();
...