Эта ошибка вызвана тем, что withSystemTempFile
блокирует файл при входе. Он возвращает вам свой дескриптор (в вашем коде он называется tempFilePathHandle
), поэтому вы можете прочитать файл с помощью дескриптора, например:
contents <- hGetContents tempFilePathHandle
EDIT
Это потому, что GH C внутренне реализует блокировку reader-writer , чтобы отслеживать, какие файлы он открыл и какие разрешения требуются. Блокировка чтения-записи разрешает либо только одного автора (эксклюзивный доступ), либо несколько читателей (общий доступ).
В этом случае withSystemTempFile
получает блокировку записи для временного файла, и поэтому readFile
не может получить блокировку считывателя, в которой он нуждается (потому что, опять же, блокировка записи запрещает GH C от получить любой читатель блокирует этот файл).
Вот ссылка на код C, реализующий блокировку. Как подсказывает @luqui в комментарии ниже, это, возможно, не оптимальное решение, тем более что GH C не запрашивает каких-либо блокировок на уровне ОС, поэтому такие процессы, как cat
, могут по-прежнему обращаться к файлам и изменять их. Это может иметь больше смысла в ленивом контексте, где чтение и запись в файл приведет к трудно предсказуемым результатам.