Кароч. Файлы открываются через io.open:
local file = io.open("path/to/file.fmt", "rb")
Второй аргумент — режим открытия файла. Тебя интересуют в основном три режима:
— r — режим чтения, курсор в начале файла
— w — режим записи, содержимое файла очищается в момент открытия в этом режиме
— a — режим дополнения, содержимое файла сохраняется, курсор установлен в конец файла
Если к режиму добавить "b" ("wb/rb/ab") — оно начнёт читать/писать в бинарном формате, без дополнительной пред/постобработки файлов. Крайне советую использовать его ВСЕГДА, потому что пред-постобработка может сильно мешать парсингу файла.
Если к режиму добавить "+" — текущий режим открытия начинает работать и на чтение, и на запись. То есть можно одновременно считывать и записывать этот файл, а режим "ab+" позволяет дополнять файл, считывать его содержимое и дописывать.
Когда ты открываешь файл, он представляет собой некоторую фиговину с текущим курсором.
local file = io.open("bla.txt", "rb")
local block1 = file:read(30) -- считываем первые 30 байт
local block2 = file:read(20) -- считываем следующие 20 байт
Курсор — текущее положение в файле, буквально как будто ты открыл его в блокноте и двигаешь кнопками-стрелками курсор, при чтении и записи — курсор перемещается на новую позицию.
Для перемещения курсора используется file:seek("mode", bytes). Им можно перемещать курсор на конкретную позицию в байтах seek:("set", 100500), в начало ("set", 0) и в конец ("end") файла.
Лайфхак: оно возвращает позицию курсора при смещениях, поэтому если мы переместили seek'ом в конец — оно вернёт объём файла в байтах:
function fsize (file)
local current = file:seek() -- get current position
local size = file:seek("end") -- get file size
file:seek("set", current) -- restore position
return size
end
Соответственно, в режиме записи, можно передвинуть курсор на нужную позицию и вписать в середину файла кусочек данных. Но так как файл может расширяться только с конца, оно перетрёт то что было на тех байтах, в которые встало то что ты записал (как ввод текста с включённым insert на клавиатуре).
Когда файл тебе больше не нужен — крайне желательно завершить его работу с file:close(), потому что хендлер файла останется жив пока его не соберёт сборка мусора хрен знает когда.