【问题标题】:.NET - TextWriterTraceListener, file in use by another process.NET - TextWriterTraceListener,另一个进程正在使用的文件
【发布时间】:2011-09-01 22:45:31
【问题描述】:

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

// 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 异常(文件正在被另一个进程使用)。

有什么想法吗?

【问题讨论】:

    标签: .net exception logging


    【解决方案1】:

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

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

    不要忘记在进程启动时总是会创建一个 DefaultTraceListener,除非您明确删除它。

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

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

    【讨论】:

    • 啊!是的,我是在检查收藏后才发现的。这行得通。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 2013-12-01
    • 2013-01-05
    相关资源
    最近更新 更多