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

Rob*_*son 7 .net logging exception

我正在创建这样的跟踪侦听器:

// Setup log tracing.

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

当我检测到文件太大时,我想要截断它(或者更确切地说,只取最后N行).为了做到这一点,我想读取文件,但似乎无关紧要的是跟踪侦听器锁定它,即尝试删除跟踪侦听器并像这样处理它的流:

// Clear logging.

Trace.Listeners[0].Close();
Trace.Listeners[0].Dispose();                     
Trace.Listeners.Clear();
Run Code Online (Sandbox Code Playgroud)

,在读这样之前:

// Read in existing log.

string[] lines = File.ReadAllLines(MyLogPath);
Run Code Online (Sandbox Code Playgroud)

,给我一个IO异常(文件正由另一个进程使用).

有什么想法吗?

hem*_*emp 4

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

但是,关闭 TraceListener确实会关闭底层流。问题很可能是您关闭了错误的侦听器。

不要忘记,除非您显式删除它,否则在进程启动时总会创建一个 DefaultTraceListener。

所以你的代码的正确版本应该是:

Trace.Listeners[1].Close();
Trace.Listeners[1].Dispose();
Trace.Listeners.Clear();
Run Code Online (Sandbox Code Playgroud)