Проблема блокировки файлов журнала в C #
-
03-10-2019 - |
Вопрос
У меня есть служба Windows, которая записывает записи файла журнала в файл журнала XML. Я поддерживаю ручку к файлу журнала, пока служба работает, и закрывается, промойте и утилизируйте его, когда служба остановлена. Операции записи файлов предназначены только по службе службы, и у меня открыта FileStream в FileAccess.ReadWrite во время совместного использования в FileShare. Я хотел бы иметь возможность открыть и просматривать этот файл с вызовом XMLREAD () другим приложением, но я получаю ошибку, указав файл, используемый другим процессом. Я прочитал другой пост на этом и находился под впечатлением, это было возможно: Другое нить.
Писатель в использовании покраснется, закрывается и утилизируется, и каждый писать FileStream покраснется. Это просто невозможно в .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.ReadWrite
. Отказ Опция по умолчанию для FileShare
является None
.