openFile - разрешение запрещено - при чтении и записи в один и тот же файл - PullRequest
2 голосов
/ 21 мая 2011

У меня появляется ошибка 'openFile - в доступе отказано' при попытке записать что-либо в файл:

saveFile content path = do
        writeFile path (show content)

почему?

1 Ответ

8 голосов
/ 21 мая 2011

Судя по вашим вопросам, вы используете readFile и writeFile из System.IO в одном файле.

Помните, что System.IO.readFile равняется lazy , что означает, что дескриптор файла сначала открывается, а затем, когда вашей программе требуются данные, фрагменты будут прочитаны. Дескриптор файла будет закрыт только после прочтения всех данных или удаления всех ссылок на файл. До этого момента ресурс заблокирован .

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

loadFileStrict :: Read a => FilePath -> IO a
loadFileStrict f = do
    s <- readFile f
    length s `seq` return s

Здесь мы запрашиваем длину строки перед возвратом результата. Это заставляет все содержимое быть прочитанным.

Этот шаблон записан в строгом пакете.

...