.NET - TextWriterTraceListener,由另一个进程使用的文件

时间:2011-05-25 16:50:38

标签: .net exception logging

我正在创建一个跟踪侦听器:

// 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);

,给我一个IO异常(另一个进程正在使用该文件)。

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

一旦TraceWriter打开文件,你无法重新打开文件的原因是因为它以“读取”的共享模式打开它(每个进程监视器)。该共享模式意味着您无法使用写访问权限重新打开它(创建新句柄)。

但是,关闭TraceListener 关闭基础流。问题很可能是你正在关闭错误的听众。

不要忘记在进程启动时始终会创建DefaultTraceListener,除非您明确删除它。

因此,您的代码的正确版本应为:

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