代码之家  ›  专栏  ›  技术社区  ›  codewright

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

  •  2
  • codewright  · 技术社区  · 14 年前

    我有一个windows服务,它将日志文件条目写入XML日志文件。我在服务运行时维护日志文件的句柄,并在服务停止时关闭、刷新和处置它。文件写入操作仅由服务执行,我在中打开了filestream文件访问.读写共享设置为文件共享。读取. 我希望能够通过另一个应用程序的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);
    }
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   Nathan Wheeler    14 年前

    您还需要关闭文件流。至少,当服务退出时,或者当文件流超出应用程序的作用域时,需要关闭它。

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

    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