2012-04-30 2 views
16

J'essaye de lire un fichier mp3 complet afin de lire les tags id3. C'est à ce moment que j'ai remarqué que le fichier: read ("* a") ne semble pas lire le fichier complet mais plutôt une petite partie. J'ai donc essayé de construire une sorte de solution afin d'obtenir le contenu du fichier entier:Lire des fichiers entiers dans 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 

pour mon testfile, cela montre que sont effectués 256 opérations de lecture, la lecture d'un total de ~ 113kb (le fichier entier est ~ 7MB). Bien que cela suffise pour lire la plupart des tags id3, je me demande pourquoi Lua se comporte de cette façon (surtout parce qu'il ne le fait pas lors de la lecture de gros fichiers texte tels que * .oj ou * .ase). Y at-il une explication pour ce comportement ou peut-être une solution pour lire de manière fiable l'ensemble du fichier?

+5

Êtes-vous sur Windows? assurez-vous d'ouvrir le fichier en mode binaire ("rb" à io.open) – daurnimator

+1

Argh, c'était le point. Je n'ai jamais eu besoin d'utiliser le mode binaire avant. Merci beaucoup! –

+0

Quelqu'un pourrait-il expliquer le format *** all ** dans la fonction 'f: read (" * all ")'? Il semble que "* all" est égal à "* a"? Je ne pouvais pas trouver le document dans le manuel de lua https://www.lua.org/manual/5.1/manual.html#pdf-file:read –

Répondre

44

Je dois manquer quelque chose mais je ne vois pas pourquoi une boucle est nécessaire. Cela devrait fonctionner (mais vous feriez mieux d'ajouter la gestion des erreurs au cas où le fichier ne peut être ouvert):

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

comme peut être vu dans les commentaires à ma question, @daurnimator déjà compris que le problème était le b manquant, mais merci pour votre réponse de toute façon :) edit: J'ai marqué votre réponse comme acceptée afin de montrer aux gens ma question a été résolu. –

Questions connexes