Судя по вашим вопросам, вы используете 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
Здесь мы запрашиваем длину строки перед возвратом результата. Это заставляет все содержимое быть прочитанным.
Этот шаблон записан в строгом пакете.