2012-04-30 2 views
16

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

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 

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

+5

Вы в окнах? убедитесь, что вы открыли файл в двоичном режиме («rb» до io.open) – daurnimator

+1

Argh, это был момент. Никогда раньше не приходилось использовать двоичный режим. Большое спасибо! –

+0

Может кто-нибудь объяснить формат *** all ** в функции 'f: read (" * all ")'? Кажется, «все» равно «* а»? Я не мог найти документ в руководстве lua https://www.lua.org/manual/5.1/manual.html#pdf-file:read –

ответ

44

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

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

, как видно из комментариев к моему вопросу, @daurnimator уже выяснил, что проблема была в недостатке b, но спасибо за ваш ответ в любом случае :) Редактировать: Я отметил ваш ответ как принятый, чтобы показать людям, что мой вопрос имеет была решена. –

Смежные вопросы