C#のログファイルロックの問題
-
03-10-2019 - |
質問
XMLログファイルにログファイルエントリを書き出すWindowsサービスがあります。サービスが動作している間にログファイルのハンドルを維持し、サービスが停止したときに閉じ、フラッシュし、処分します。ファイルの書き込み操作はサービスのみであり、私はfileStream.readwriteでFileStheamを開いています。別のアプリケーションでXMLREAD()呼び出しでこのファイルを開いて表示できるようにしたいのですが、別のプロセスでファイルが使用されていることを示すエラーが表示されます。私はこれに関する別の投稿を読んでいたが、これが可能だったという印象の下にあった: 他のスレッド.
使用されている作家はフラッシュされ、閉じられ、処分され、それぞれフィルストリームを書くことがフラッシュされます。これは.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);
}
解決
また、Filestreamを閉じる必要があります。少なくとも、サービスが終了したとき、またはFilestreamがアプリケーションの範囲外に出たときに閉じる必要があります。
どちらにしても、別のアプリケーションから読み取るように開くことができるはずですが、それを指定する必要がありますが、それはデフォルトではありません。
サービスでは、ファイル共有を有効にする必要があります。
FileStream fs = new FileStream("path", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);
そしてあなたの読者アプリケーションで:
FileStream fs = new FileStream("path", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
なしで FileShare.Read
, 、読み取りのためにファイルを開くためのすべてのリクエストが失敗します。書き込み対応の共有のために、書き込みのためにファイルを開くことを要求する他のアプリケーションは引き続き失敗します FileShare.ReadWrite
. 。のデフォルトオプション FileShare
は None
.