2

ログ ファイル エントリを 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);
}
4

1 に答える 1

3

FileStream も閉じる必要があります。少なくとも、サービスが終了するとき、または FileStream がアプリケーションのスコープから外れるときに、それを閉じる必要があります。

どちらの方法でも、別のアプリケーションから ReadOnly として開くことができるはずですが、それを指定する必要があります。これはデフォルトではありません。

サービスで、ファイル共有を有効にする必要があります。

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

于 2010-09-15T19:24:47.337 に答える