2012-04-30 12 views
16

में पूरी फाइलें पढ़ना मैं id3 टैग को पढ़ने के लिए एक पूर्ण एमपी 3 फ़ाइल पढ़ने की कोशिश कर रहा हूं। जब मैंने देखा कि फ़ाइल: पढ़ा ("* ए") स्पष्ट रूप से पूर्ण फ़ाइल नहीं बल्कि एक छोटा सा हिस्सा पढ़ता है।लुआ

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 
मेरी testfile के लिए

, इस से पता चलता है कि 256 पढ़ने संचालन प्रदर्शन कर रहे हैं, ~ 113kb (पूरी फ़ाइल की कुल पढ़ने: तो मैं क्रम में समाधान किसी तरह का निर्माण करने के लिए पूरे फ़ाइल की सामग्री प्राप्त करने की कोशिश ~ 7 एमबी है)। यद्यपि यह अधिकांश id3 टैग पढ़ने के लिए पर्याप्त होना चाहिए, मुझे आश्चर्य है कि क्यों लुआ इस तरह से व्यवहार करता है (विशेष रूप से क्योंकि यह बड़ी टेक्स्टबैस्ड फ़ाइलों जैसे * .oj या * .ase) को पढ़ता नहीं है। क्या इस व्यवहार के लिए कोई स्पष्टीकरण है या शायद पूरी फ़ाइल को विश्वसनीय रूप से पढ़ने का समाधान है?

+5

क्या आप विंडोज़ पर हैं? सुनिश्चित करें कि आप फ़ाइल को द्विआधारी मोड ("आरबी" से io.open) – daurnimator

+1

Argh में खोलें, यह बिंदु था। पहले कभी बाइनरी मोड का उपयोग नहीं किया था। आपका बहुत बहुत धन्यवाद! –

+0

कोई व्यक्ति प्रारूप में समझा सकता है *** सभी ** समारोह में 'f: read ("* all") '? ऐसा लगता है कि "* सब" बराबर है "* ए"? मुझे लूआ मैनुअल में दस्तावेज़ नहीं मिला https://www.lua.org/manual/5.1/manual.html#pdf-file:read –

उत्तर

44

मुझे कुछ याद आना चाहिए लेकिन मैं यह देखने में असफल रहा कि एक लूप की आवश्यकता क्यों है। यह काम करना चाहिए (लेकिन फ़ाइल को खोला नहीं जा सकता है, तो आप बेहतर तरीके से त्रुटि प्रबंधन जोड़ना चाहते हैं):

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

जैसा कि मेरे प्रश्न पर टिप्पणियों में देखा जा सकता है, @daurnimator पहले से ही पता चला है कि समस्या गायब बी थी, लेकिन आपके उत्तर के लिए धन्यवाद :) संपादित करें: मैंने आपके प्रश्न को लोगों को दिखाने के लिए स्वीकार किए जाने के रूप में स्वीकार किया है हल किया गया –