Pregunta

Tengo un servicio de Windows que escribe entradas del archivo de registro a un archivo de registro XML. Mantengo un identificador para el archivo de registro mientras que el servicio está en funcionamiento, y cerca, al ras y disponer de ella cuando se detiene el servicio. Las operaciones de escritura de archivos son por el servicio solamente, y no tengo la filestream abierta en FileAccess.ReadWrite mientras que el intercambio se establece en FileShare.Read. Me gustaría ser capaz de abrir y ver este archivo con una llamada XmlRead () por otra aplicación, pero me da un error que indica que el archivo está siendo utilizado por otro proceso. Había leído otro puesto en esto y tenía la impresión de que esto era posible: otro hilo .

El escritor en uso se vacía, cerrada, y desecharse, y cada uno de escritura, el filestream se vacía. Es esto simplemente no es posible en .Net, o quizá haber He hecho algo mal? Una versión disección del código siguiente:

if (_logFS == null)
        _logFS = new FileStream(_fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);

if (!initFile)
{
    _logFS.Seek(-13, SeekOrigin.End);
}

XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.OmitXmlDeclaration = true;
using (XmlWriter writer = XmlWriter.Create(_logFS, settings))
{
    if (initFile)
    {
        writer.WriteRaw("<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>\n");
        writer.WriteStartElement("Entries", "http://www.abcdefg.com);
    }

    writer.WriteStartElement("Exception");
    // write out some stuff here.
    writer.WriteEndElement();


    writer.Flush();
    writer.Close();
}

_logFS.Flush();

El código de apertura de archivos es ahora de la siguiente manera:

_LogDS = new XmlLogFile();
using (FileStream logFS = new FileStream(_fileName, FileMode.Open, FileAccess.Read)
{
    _LogDS.ReadXml(logFS);
}
¿Fue útil?

Solución

También es necesario cerrar el FileStream. Como mínimo, es necesario cerrarlo cuando sus salidas de servicio, o cuando el FileStream irían fuera del ámbito de la aplicación.

debe ser capaz de abrirlo como de sólo lectura desde otra aplicación de cualquier manera, pero hay que especificar que, no es un defecto.

En su servicio necesita habilitar el uso compartido de archivos:

FileStream fs = new FileStream("path", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);

Y en su aplicación de lectura:

FileStream fs = new FileStream("path", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

Sin la FileShare.Read, todas las solicitudes para abrir el archivo para la lectura de fallar. Cualquier otra aplicación que solicita para abrir el archivo para escritura se siguen sin funcionar, para compartir con permiso de escritura que tendría que utilizar FileShare.ReadWrite. La opción por defecto para FileShare es None.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top