我有一个Windows服务,将日志文件条目写入XML日志文件。在服务运行时,我在日志文件时保持了一个句柄,并在停止服务时关闭,冲洗和处置。文件写入操作仅由服务,我在fileaccess.readwrite中打开了fileStream,共享设置为fileshare.read。我希望能够通过另一个应用程序打开并使用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 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.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top