Чтение целых файлов в Lua

Я пытаюсь прочитать полный mp3 файл, чтобы читать теги id3. Это, когда я заметил, что файл: read ( "* a" ), по-видимому, не читает полный файл, а скорее небольшую часть. Поэтому я попытался создать какое-то обходное решение, чтобы получить содержимое всего файла:

function readAll(file)
    local f = io.open(file, "r")
    local content = ""
    local length = 0

    while f:read(0) ~= "" do
        local current = f:read("*all")

        print(#current, length)
        length = length + #current

        content = content .. current
    end

    return content
end

для моего тестового файла, это показывает, что выполняется 256 операций чтения, общая сумма которых составляет ~ 113 КБ (весь файл ~ 7 МБ). Хотя этого должно быть достаточно для чтения большинства тегов id3, мне интересно, почему Lua ведет себя таким образом (особенно потому, что это не при чтении больших текстовых файлов, таких как *.oj или *.ase). Есть ли объяснения для этого поведения или, возможно, решение для надежного чтения всего файла?

Ответы

Ответ 1

Мне нужно что-то упустить, но я не понимаю, зачем нужен цикл. Это должно работать (но вам лучше добавить обработку ошибок, если файл не открывается):

function readAll(file)
    local f = assert(io.open(file, "rb"))
    local content = f:read("*all")
    f:close()
    return content
end