2

我有一个将日志文件条目写入 XML 日志文件的 Windows 服务。我在服务运行时维护日志文件的句柄,并在服务停止时关闭、刷新和处置它。文件写入操作仅由服务进行,我在 FileAccess.ReadWrite 中打开文件流,而共享设置为 FileShare.Read。我希望能够通过另一个应用程序的 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 超出应用程序范围时关闭它。

无论哪种方式,您都应该能够从另一个应用程序以只读方式打开它,但您必须指定它,这不是默认设置。

在您的服务中,您需要启用文件共享:

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。的默认选项FileShareNone

于 2010-09-15T19:24:47.337 回答