gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:43:52 24 4
gpt4 key购买 nike

我有一个将日志文件条目写出到 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);
}

最佳答案

您还需要关闭 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.ReadWriteFileShare 的默认选项是 None

关于c# - C# 中的日志文件锁定问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3721028/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com