2012-04-30 19 views
16

Estoy tratando de leer un archivo mp3 completo para leer las etiquetas id3. Fue entonces cuando noté que el archivo: read ("* a") aparentemente no lee el archivo completo, sino una pequeña parte. Así que traté de construir algún tipo de solución con el fin de obtener el contenido de todo el archivo:Lectura de archivos completos en 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 

para mi testfile, esto demuestra que se llevan a cabo 256 operaciones de lectura, la lectura de un total de ~ 113KB (todo el archivo es ~ 7MB). Aunque esto debería ser suficiente para leer la mayoría de las etiquetas id3, me pregunto por qué Lua se comporta de esta manera (especialmente porque no lo hace cuando lee archivos de texto grandes como * .oj o * .ase). ¿Hay alguna explicación para este comportamiento o tal vez una solución para leer de manera confiable todo el archivo?

+5

¿Estás en windows? asegúrese de abrir el archivo en modo binario ("rb" a io.open) – daurnimator

+1

Argh, ese era el punto. Nunca tuve que usar el modo binario antes. ¡Muchas gracias! –

+0

¿Podría alguien explicar el formato *** all ** en la función 'f: read (" * all ")'? Parece que "* all" es igual a "* a"? No pude encontrar el documento en el manual de lua https://www.lua.org/manual/5.1/manual.html#pdf-file:read –

Respuesta

44

Me falta algo, pero no veo por qué es necesario un ciclo. Esto debería funcionar (pero será mejor que agregue el manejo de errores en caso de que no se pueda abrir el archivo):

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

como se puede ver en los comentarios a mi pregunta, @daurnimator ya descubrió que el problema era la b faltante, pero gracias por su respuesta de todos modos :) editar: Marqué su respuesta como aceptada para mostrar a las personas que mi pregunta tiene sido resuelto –