【发布时间】:2010-09-15 19:19:19
【问题描述】:
我有一个将日志文件条目写入 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);
}
【问题讨论】:
-
我还注意到,在服务运行时,我可以在 Notepad++ 中打开和查看文件。当我尝试通过 DataSet.XmlRead() 加载文件时,它是否可能试图在我的其他代码中获得排他锁?
-
我的最后一条评论打错了,我的意思是 DataSet.ReadXml()。
标签: c# logging file-io file-locking