2010-09-15 5 views
2

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); 
} 
+0

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

+0

Typo'ed mon dernier commentaire, je voulais dire DataSet.ReadXml(). – codewright

Répondre

3

Vous devez également fermer la FileStream. Au minimum, vous devez le fermer lorsque votre service se termine ou lorsque le FileStream sort de la portée de l'application.

Vous devriez pouvoir l'ouvrir en tant que ReadOnly à partir d'une autre application de toute façon, mais vous devez spécifier 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 d'ouvrir le fichier pour la lecture échouer. Toute autre application demandant l'ouverture du fichier en écriture échouera toujours, pour le partage en écriture vous utiliserez FileShare.ReadWrite. L'option par défaut pour FileShare est None.

+0

Je pensais que l'idée était de garder le flux de fichiers ouvert dans le service, donc je n'ai pas eu à continuer à le rouvrir. – codewright

+0

Fournirez-vous le code que vous utilisez pour accéder au flux depuis votre autre application. – AndHeCodedIt

+0

Terminé, pour l'application de service et l'application de lecteur. –