J'ai un service Windows qui écrit les entrées du fichier journal dans un fichier journal XML. Je gère un fichier journal pendant que le service est opérationnel, et le ferme, le vide et l'élimine lorsque le service est arrêté. Les opérations d'écriture de fichier sont effectuées uniquement par le service et le flux de fichiers est ouvert dans FileAccess.ReadWrite alors que le partage est défini sur FileShare.Read. Je voudrais être en mesure d'ouvrir et d'afficher ce fichier avec un appel XmlRead() par une autre application, mais j'obtiens une erreur indiquant que le fichier est utilisé par un autre processus. J'avais lu un autre post à ce sujet et était sous l'impression que c'était possible: Other Thread.Problème de verrouillage du fichier journal en C#
L'enregistreur utilisé est vidé, fermé et éliminé, et chaque écriture du flux de fichiers est vidée. Est-ce que ce n'est pas possible dans .Net, ou 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);
}
J'ai également remarqué que pendant que le service est en cours d'exécution, que je peux ouvrir et afficher le fichier dans Notepad ++. Est-il possible lorsque j'essaye de charger le fichier via DataSet.XmlRead() qu'il essaye d'obtenir un verrou exclusif dans mon autre code? – codewright
Typo'ed mon dernier commentaire, je voulais dire DataSet.ReadXml(). – codewright