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