我正在创建一个跟踪侦听器:
// 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异常(另一个进程正在使用该文件)。
有什么想法吗?
答案 0 :(得分:4)
一旦TraceWriter打开文件,你无法重新打开文件的原因是因为它以“读取”的共享模式打开它(每个进程监视器)。该共享模式意味着您无法使用写访问权限重新打开它(创建新句柄)。
但是,关闭TraceListener 会关闭基础流。问题很可能是你正在关闭错误的听众。
不要忘记在进程启动时始终会创建DefaultTraceListener,除非您明确删除它。
因此,您的代码的正确版本应为:
Trace.Listeners[1].Close();
Trace.Listeners[1].Dispose();
Trace.Listeners.Clear();