Domanda

Ho un servizio di Windows che scrive le voci del file di registro in un file di registro XML. Io sostengo un handle per il file di log, mentre il servizio è operativo, e vicino, a filo e smaltirlo quando il servizio viene arrestato. Le operazioni di scrittura file sono dal servizio unico, e ho la filestream aperto in FileAccess.ReadWrite mentre la condivisione è impostata su FileShare.Read. Vorrei essere in grado di aprire e visualizzare il file con una chiamata XMLRead () da un'altra applicazione, ma ottengo un errore che indica che il file è utilizzato da un altro processo. Avevo letto un altro post su questo ed era sotto l'impressione che questo era possibile: altro thread .

Lo scrittore in uso viene lavata, chiusa e smaltiti, e ogni scrittura la filestream viene svuotata. Questo è solo non è possibile in .Net, o ti ho forse fatto qualcosa di sbagliato? Una versione cutdown del codice segue:

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();

Il codice di apertura file è ora la seguente:

_LogDS = new XmlLogFile();
using (FileStream logFS = new FileStream(_fileName, FileMode.Open, FileAccess.Read)
{
    _LogDS.ReadXml(logFS);
}
È stato utile?

Soluzione

È inoltre necessario chiudere il FileStream. Come minimo, è necessario chiudere quando le vostre uscite di servizio, o quando il FileStream sarebbe andato fuori portata dell'applicazione.

Si dovrebbe essere in grado di aprirlo come ReadOnly da un'altra applicazione in entrambi i casi, ma si deve precisare che, non è un difetto.

Nel vostro servizio è necessario per abilitare la condivisione di file:

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

E nella vostra applicazione per la lettura:

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

Senza la FileShare.Read, tutte le richieste per aprire il file per la lettura di fallire. Qualsiasi altra applicazione che richiede di aprire il file per la scrittura sarà ancora fallire, per la scrittura-abilitato la condivisione usereste FileShare.ReadWrite. L'opzione predefinita per FileShare è None.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top