Подтвердить что ты не робот

Чтение файла, используемого другим процессом

Я отслеживаю текстовый файл, который записывается программой сервера. Каждый раз, когда файл изменяется, содержимое выводится в окно моей программы.

Проблема заключается в том, что я не могу использовать Streamreader в файле, поскольку он является used by another process. Настройка Filestream с помощью ReadWrite не принесет никакой пользы, поскольку я не могу управлять процессом, использующим файл.

Я могу открыть файл в блокноте. Он должен иметь доступ к нему, даже если сервер использует его.

Есть ли хороший способ обойти это?

Должен ли я сделать следующее?

  • Отслеживать файл
  • Сделайте временную копию, когда она изменится
  • Прочитайте временную копию
  • Удалить временную копию.

Мне нужно получить текст в файле всякий раз, когда сервер меняет его.

4b9b3361

Ответ 1

Если блокнот может читать файл, тогда вы можете, очевидно, что программа не поместила блокировку чтения в файл. Проблема, с которой вы столкнулись, заключается в том, что StreamReader откроет файл с помощью FileShare.Read. Что отрицает доступ к записи. Это не сработает, другая программа уже получила доступ на запись.

Вам понадобится создать StreamReader следующим образом:

using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (var sr = new StreamReader(fs, Encoding.Default)) {
    // read the stream
    //...
}

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

Ответ 2

Вызов

File.Open(path, FileMode.Read, FileAccess.Read, FileShare.ReadWrite)

Это должно работать до тех пор, пока другое приложение не заблокировало файл исключительно.