Чтение заблокированного файла в Linux с использованием C# - PullRequest
2 голосов
/ 26 марта 2020

Есть процесс, который пишет в файл, работающий на моей локальной Linux машине. Имеет блокировку «Запись». Я могу проверить это с помощью sudo lslocks | grep myFile.txt

myApplication 2810 FLOCK 4.5M WRITE 0 0 0 /var/opt/myApplication/logs/myFile.txt

Обратите внимание, что это это не обязательный замок, это рекомендательный. Также обратите внимание, я могу прочитать этот файл, используя vi или cat. Я даже могу открыть его, используя несколько строк Python:

f = open("/var/opt/myApplication/logs/myFile.txt", "r")
print(f.readline())

Но я не смог открыть его, используя C#. Я пробовал несколько разных способов, но все они терпят неудачу. Тот же код при запуске на Windows с использованием версии Windows того же внешнего процесса, который записывает в файл, работает нормально.

Вот код C#, который, как я полагал, сработал бы.

var fileInfo = new FileInfo("/var/opt/myApplication/logs/myFile.txt");
var file = fileInfo.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete);

Этот код не работает, и возникает исключение ввода-вывода, говорящее:

процесс не может получить доступ к файлу '/var/opt/myApplication/logs/myFile.txt', поскольку он используется другим процессом.

Похоже, исключение происходит изнутри FileStream.Unix.cs в результате вызова Interop.Sys.FLock, возвращающего ошибку:

Interop.Sys.LockOperations lockOperation = (share == FileShare.None) ? Interop.Sys.LockOperations.LOCK_EX : Interop.Sys.LockOperations.LOCK_SH;

if (Interop.Sys.FLock(_fileHandle, lockOperation | Interop.Sys.LockOperations.LOCK_NB) < 0)

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

Обновление: не знаю, имеет ли это значение или нет (я полагаю, нет), но это все на установка CentOs 7

...