2011-05-25 19 views
7

estoy creando una escucha de seguimiento de esta manera:.NET - TextWriterTraceListener, el archivo está en uso por otro proceso

// Setup log tracing. 

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

Cuando detecto el archivo ha conseguido demasiado grande, estoy queriendo trunca (o más bien, tome las últimas N líneas solamente). Para hacer esto, quiero leer el archivo, pero parece que no importa lo que haga el trazador de escucha tiene un bloqueo, es decir, tratando de eliminar el trazador de escucha y deshacerse de su secuencia de esta manera:

// Clear logging. 

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

, antes de leerlo en este aspecto:

// Read in existing log. 

string[] lines = File.ReadAllLines(MyLogPath); 

, me da una excepción IO (archivo está en uso por otro proceso).

¿Alguna idea?

Respuesta

4

Bueno, la razón por la que no se puede volver a abrir el archivo una vez que es abierto por el TraceWriter es porque lo abre con un Modo de compartir de 'Leer' (por monitor de proceso). Ese modo compartir significa que no puede volver a abrirlo (crear un nuevo identificador) con acceso de escritura.

Sin embargo, cerrar TraceListener hace cerrar la secuencia subyacente. El problema es que estás cerrando al oyente equivocado.

No olvide que siempre hay un DefaultTraceListener creado en el inicio del proceso a menos que lo elimine explícitamente.

Así que la versión correcta de su código debe ser:

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

Ah! Sí, acabo de descubrir esto después de inspeccionar la colección. Esto funciona. – Robinson

Cuestiones relacionadas