Question

J'ai un service Windows qui écrit les entrées de fichier journal à un fichier journal XML. Je maintiens une poignée dans le fichier journal alors que le service est opérationnel, et à proximité, chasse d'eau et Éliminez quand le service est arrêté. Les opérations d'écriture de fichiers sont par le service que, et je le filestream ouvert FileAccess.ReadWrite pendant le partage est réglé sur FileShare.Read. Je voudrais être en mesure d'ouvrir et d'afficher ce fichier avec un appel XMLLit () par une autre application, mais je reçois une erreur indiquant que le fichier est utilisé par un autre processus. J'avais lu un autre poste à ce sujet et avait l'impression que cela était possible: Autre fil .

L'auteur en cours d'utilisation est vidé, fermé et disposé, et chaque écriture le filestream est rincé. Est-ce tout simplement pas possible en .Net, ou peut-être ai-je fait quelque chose de mal? Une version dénudation du code suivant:

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

Le code d'ouverture de fichier est maintenant comme suit:

_LogDS = new XmlLogFile();
using (FileStream logFS = new FileStream(_fileName, FileMode.Open, FileAccess.Read)
{
    _LogDS.ReadXml(logFS);
}
Était-ce utile?

La solution

Vous devez également fermer la FileStream. Au minimum, vous devez fermer lorsque vos sorties de service, ou lorsque le FileStream sortiraient du champ de l'application.

Vous devriez pouvoir l'ouvrir comme ReadOnly d'une autre application de toute façon, mais vous devez préciser que, ce n'est pas un défaut.

Dans votre service, vous devez activer le partage de fichiers:

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

Et dans votre application de lecture:

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

Sans FileShare.Read, toutes les demandes pour ouvrir le fichier pour la lecture échouer. Toute autre demande visant à ouvrir le fichier pour l'écriture sera toujours pas, pour l'écriture activé le partage que vous utiliseriez FileShare.ReadWrite. L'option par défaut pour FileShare est None.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top