ログ ファイル エントリを XML ログ ファイルに書き込む Windows サービスがあります。サービスが稼働している間はログ ファイルへのハンドルを維持し、サービスが停止すると、ログ ファイルを閉じてフラッシュし、破棄します。ファイルの書き込み操作はサービスのみによるもので、共有が FileShare.Read に設定されている間、FileAccess.ReadWrite でファイル ストリームを開きます。別のアプリケーションで XmlRead() 呼び出しを使用してこのファイルを開いて表示できるようにしたいのですが、ファイルが別のプロセスによって使用されているというエラーが表示されます。これに関する別の投稿を読んだことがあり、これが可能であるという印象を受けました: Other Thread。
使用中のライターはフラッシュされ、閉じられ、破棄され、ファイル ストリームへの書き込みごとにフラッシュされます。これは.Netでは不可能ですか、それとも何か間違ったことをしたのでしょうか? コードの縮小バージョンは次のとおりです。
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();
ファイルを開くコードは次のようになりました。
_LogDS = new XmlLogFile();
using (FileStream logFS = new FileStream(_fileName, FileMode.Open, FileAccess.Read)
{
_LogDS.ReadXml(logFS);
}