2012-04-30 33 views
16

Tôi đang cố gắng đọc một tập tin mp3 đầy đủ để đọc các thẻ id3. Đó là khi tôi nhận thấy rằng tập tin: đọc ("* a") dường như không đọc tập tin đầy đủ mà là một phần nhỏ. Vì vậy, tôi đã cố gắng để xây dựng một số loại workaround để có được nội dung của toàn bộ file:Đọc toàn bộ tập tin trong 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 

cho testfile của tôi, điều này cho thấy rằng 256 hoạt động đọc được thực hiện, đọc tổng cộng ~ 113kB (toàn bộ tập tin là ~ 7MB). Mặc dù điều này là đủ để đọc hầu hết các thẻ id3, tôi tự hỏi tại sao Lua cư xử theo cách này (đặc biệt là bởi vì nó không khi đọc các tệp văn bản lớn như * .oj hoặc * .ase). Có bất kỳ lời giải thích nào cho hành vi này hoặc có thể là một giải pháp để đọc một cách đáng tin cậy toàn bộ tập tin?

+5

Bạn đang ở trên cửa sổ? đảm bảo rằng bạn mở tệp ở chế độ nhị phân ("rb" thành io.open) – daurnimator

+1

Argh, đó là vấn đề. Không bao giờ phải sử dụng chế độ nhị phân trước đây. Cảm ơn bạn rất nhiều! –

+0

Ai đó có thể giải thích định dạng *** tất cả ** trong hàm 'f: read (" * all ")'? Có vẻ như "* tất cả" bằng "* a"? Tôi không thể tìm thấy tài liệu trong hướng dẫn sử dụng lua https://www.lua.org/manual/5.1/manual.html#pdf-file:read –

Trả lời

44

Tôi phải thiếu điều gì đó nhưng tôi không thấy lý do tại sao vòng lặp lại là cần thiết. Điều này sẽ hoạt động (nhưng bạn nên thêm xử lý lỗi trong trường hợp tệp không thể mở được):

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

như có thể thấy trong phần nhận xét cho câu hỏi của tôi, @daurnimator đã tìm ra vấn đề là thiếu b, nhưng vẫn cảm ơn câu trả lời của bạn :) chỉnh sửa: Tôi đánh dấu câu trả lời của bạn là được chấp nhận để hiển thị mọi người câu hỏi của tôi đã được giải quyết. –

Các vấn đề liên quan