Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reading whole files in Lua

Tags:

I am trying to read a full mp3 file in order to read out the id3 tags. That's when I noticed that file:read("*a") apparently does not read the full file but rather a small part. So I tried to build some kind of workaround in order to get the content of the whole file:

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 

for my testfile, this shows that 256 reading operations are performed, reading a total of ~113kB (the whole file is ~7MB). Though this should be enough to read most id3 tags, I wonder why Lua behaves in this way (especially because it does not when reading large textbased files such as *.obj or *.ase). Is there any explanation for this behaviour or maybe a solution to reliably read the whole file?

like image 309
Henrik Ilgen Avatar asked Apr 30 '12 15:04

Henrik Ilgen


People also ask

Can Lua read files?

I/O library is used for reading and manipulating files in Lua. There are two kinds of file operations in Lua namely implicit file descriptors and explicit file descriptors.

How do I add files to Lua?

The file "header. lua" must be somewhere in Lua's search path. This wiki page describes ways of creating modules to load with require . require"header" is the correct form for the default path because require use module names not file names.

How do I print Lua?

“how to print in lua” Code Answer's -- print "Hello, World! print("Hello, World!") x = "Hello, World!"

How do I delete a file in Lua?

To delete the file, use os. remove(path) . But close the file first.


1 Answers

I must be missing something but I fail to see why a loop is needed. This should work (but you'd better add error handling in case the file cannot be opened):

function readAll(file)     local f = assert(io.open(file, "rb"))     local content = f:read("*all")     f:close()     return content end 
like image 162
lhf Avatar answered Nov 05 '22 23:11

lhf