Есть процесс, который пишет в файл, работающий на моей локальной 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