Frage

Ich habe einen Windows-Dienst, die Logfile-Einträge in eine XML-Protokolldatei schreibt. Ich halte einen Griff in die Protokolldatei, während der Dienst in Betrieb ist, und in der Nähe, bündig und entsorgen Sie es, wenn der Dienst beendet wird. Die Dateischreibvorgänge sind durch den Dienst nur, und ich habe das Filestream offen in FileAccess.ReadWrite während Sharing FileShare.Read gesetzt. Ich möchte in der Lage sein, diese Datei zu öffnen und anzuzeigen mit einem XMLRead () Aufruf von einer anderen Anwendung, aber ich erhalte eine Fehlermeldung mit Angabe der Datei von einem anderen Prozess verwendet wird. Ich hatte eine andere Stelle auf diese gelesen und hatte den Eindruck, das möglich war: Weitere Themen .

Der Schreiber im Gebrauch ist, gespült, verschlossen und entsorgt, und jeder Schreib des Filestream wird gespült. Ist das einfach nicht möglich, in .Net, oder habe ich vielleicht etwas falsch gemacht? Eine cutdown Version des Codes folgt:

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

Die Datei Öffnungscode ist nun wie folgt:

_LogDS = new XmlLogFile();
using (FileStream logFS = new FileStream(_fileName, FileMode.Open, FileAccess.Read)
{
    _LogDS.ReadXml(logFS);
}
War es hilfreich?

Lösung

Sie müssen auch die Filestream schließen. Zumindest müssen Sie es schließen, wenn der Dienst beendet wird, oder wenn der Filestream würde die Anwendung des Umfangs hinausgehen.

Sie sollten in der Lage sein, es als schreibgeschützt zu öffnen, aus einer anderen Anwendung oder so, aber das muss man angeben, es ist kein Standard.

In Ihrem Service müssen Sie die Dateifreigabe aktivieren:

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

Und in der Reader-Anwendung:

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

Ohne die FileShare.Read alle Anforderungen zum Öffnen der Datei zum Lesen fehlschlagen. Jede andere Anwendung anfordert, die Datei zum Schreiben öffnen noch nicht, für die Aufzeichnung aktivierten teilen FileShare.ReadWrite verwenden würde. Die Standardoption für FileShare ist None.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top