2012-04-30 4 views
16

Sto cercando di leggere un file mp3 completo per leggere i tag ID3. In quel momento ho notato che il file: read ("* a") a quanto pare non legge il file completo ma piuttosto una piccola parte. Così ho cercato di costruire un qualche tipo di soluzione, al fine di ottenere il contenuto di tutto il file:Lettura di interi file in 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 

per il mio testfile, questo dimostra che 256 operazioni di lettura vengono eseguite, la lettura di un totale di ~ 113KB (l'intero file è ~ 7 MB). Anche se questo dovrebbe essere sufficiente per leggere la maggior parte dei tag ID3, mi chiedo perché Lua si comporti in questo modo (soprattutto perché non funziona quando legge file di testo di grandi dimensioni come * .oj o * .ase). C'è qualche spiegazione per questo comportamento o forse una soluzione per leggere in modo affidabile l'intero file?

+5

Sei su Windows? assicurati di aprire il file in modalità binaria ("rb" su io.open) – daurnimator

+1

Argh, questo era il punto. Non ho mai dovuto usare la modalità binaria prima. Grazie mille! –

+0

Qualcuno potrebbe spiegare il formato *** tutto ** nella funzione 'f: read (" * all ")'? Sembra che "* all" sia uguale a "* a"? Non sono riuscito a trovare il documento in lua manual https://www.lua.org/manual/5.1/manual.html#pdf-file:read –

risposta

44

Mi manca qualcosa ma non riesco a capire perché è necessario un ciclo. Questo dovrebbe funzionare (ma è meglio aggiungere la gestione degli errori nel caso in cui il file non possa essere aperto):

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

come si può vedere nei commenti alla mia domanda, @daurnimator ha già capito che il problema era il mancante b, ma grazie comunque per la risposta :) modifica: ho contrassegnato la tua risposta come accettata per mostrare alla gente la mia domanda stato risolto –