C#中的日志文件锁定问题

我有一个Windows服务,它将日志文件条目写入XML日志文件。 我在服务运行时维护日志文件的句柄,并在服务停止时关闭,刷新并处理它。 文件写入操作仅由服务进行,我在FileAccess.ReadWrite中打开文件流,而共享设置为FileShare.Read。 我希望能够通过另一个应用程序的XmlRead()调用打开并查看此文件,但是我收到一条错误,指出该文件正由另一个进程使用。 我已经阅读了另一篇关于此的post,并认为这是可能的: 其他主题 。

正在使用的编写器被刷新,关闭和处理,并且每次写入文件流都被刷新。 这在.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("\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超出应用程序的范围时关闭它。

您应该可以从其他应用程序以任何方式将其作为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.ReadWriteFileShare的默认选项为“ None