FileStream в приложении не может получить доступ к файлу, заблокированному службой, несмотря на опцию FileShare.Read - PullRequest
0 голосов
/ 25 января 2019

Если я правильно понял параметры FileMode и FileAccess, мы сможем использовать их для указания одного FileStream как Чтение / Запись и предоставить второй доступ на чтение для просмотра текущего содержимого. Однако, когда они проходят отдельно через границу пользователя / сервиса, мы получаем IOException.

У нас есть простая установка, где служба C # запускается и генерирует текстовый файл журнала, и у нас есть приложение WinForms, которое пытается «открыть / прочитать / закрыть» (по нажатию кнопки) один и тот же файл журнала, чтобы отобразить (снимок) его содержимое.

Служба C # открывает при запуске FileStream и сохраняет ее открытой в течение всего срока службы:

_serviceLogLock = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.Read);

Необслуживаемое (WinForms) приложение затем пытается открыть тот же файл только для чтения содержимого:

using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))

Это вызывает

IOException: «Процесс не может получить доступ к файлу« xxx », поскольку он используется другим процессом».

Учитывая, что служба явно открывает файл, используя опцию FileShare.Read, я ожидаю, что приложение WinForms получит доступ для чтения, который он запрашивает.

1 Ответ

0 голосов
/ 25 января 2019

В не-сервисном приложении также требуется параметр FileShare.ReadWrite, в результате чего:

using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))

Проблема, с которой вы столкнулись, заключается не в том, что служба не разрешает не-сервисному приложению открывать файл, а в том, что ваше не-сервисное приложение пытается прочитать файл, заявляя, что он не может быть прочитан / записан / удаляется другими процессами в то же время, когда какой-либо другой процесс уже открыл его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...