Чтение файла, используемого другим процессом
Я отслеживаю текстовый файл, который записывается программой сервера. Каждый раз, когда файл изменяется, содержимое выводится в окно моей программы.
Проблема заключается в том, что я не могу использовать Streamreader
в файле, поскольку он является used by another process
. Настройка Filestream
с помощью ReadWrite
не принесет никакой пользы, поскольку я не могу управлять процессом, использующим файл.
Я могу открыть файл в блокноте. Он должен иметь доступ к нему, даже если сервер использует его.
Есть ли хороший способ обойти это?
Должен ли я сделать следующее?
- Отслеживать файл
- Сделайте временную копию, когда она изменится
- Прочитайте временную копию
- Удалить временную копию.
Мне нужно получить текст в файле всякий раз, когда сервер меняет его.
Ответы
Ответ 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)
Это должно работать до тех пор, пока другое приложение не заблокировало файл исключительно.