Вопрос

У меня есть служба 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top