2012-12-18 7 views
5

मैं कुछ कमी या Node.js के मानक फ़ाइल मैं/हे सामान्य फ़ाइल रैंडम एक्सेस विधियों में से मॉड्यूल कमी एनालॉग करता हूँ?मैं node.js का उपयोग कर (बड़ी) फ़ाइलों से यादृच्छिक पहुंच कैसे पढ़ूं?

  • seek()/fseek()
  • tell()/ftell()

कैसे एक पढ़ा यादृच्छिक निश्चित-आकार इन बिना नोड में बड़ी फ़ाइलों से रिकॉर्ड करता है?

उत्तर

7

tell नहीं है, लेकिन यह पहले से ही एक फ़ाइल में स्थिति में आप पर कर रहे हैं पता नहीं है, या अपने आप को ट्रैक रखने के लिए कोई तरीका मौजूद नहीं करने के लिए बहुत दुर्लभ है।

seek अप्रत्यक्ष रूप से fs.read और fs.write के तर्क के माध्यम से अप्रत्यक्ष रूप से उजागर किया गया है। जब दी, तर्क इसके संचालन प्रदर्शन से पहले उस स्थान की तलाश करेंगे, और यदि null, यह जो कुछ भी पिछली स्थिति यह था का उपयोग करेगा।

+1

बार मैं उपयोग 'tell' ज्यादातर जब मैं में पाठ पढ़ रहा हूँ कर रहे हैं मंच-नास्तिक कोड पंक्ति-दर-पंक्ति हो सकता था जो या तो' \ n' में समाप्त होने वाले '\ r' (अब आम) लाइनों, या' \ r \ n'। हालांकि 'बताना' के बिना स्थिति को ट्रैक करना निश्चित रूप से अभी भी संभव है। – hippietrail

+0

किसी अन्य व्यक्ति के लाभ के लिए जो इस धागे को पढ़ सकता है, मैंने 'स्थिति' पैरामीटर को याद किया क्योंकि दस्तावेज़ों के पढ़ने में मैंने इसे 'ऑफसेट' पैरामीटर से भंग करने में कामयाब रहा, जो कि बफर की शुरुआत से ऑफसेट है डेटा को पढ़ना चाहते हैं। – hippietrail

+0

यह बाइनरी फ़ाइलों से रिकॉर्ड पढ़ने के लिए बहुत अच्छा काम करता है, लेकिन मुझे पास की गई फाइल ऑफसेट से टेक्स्ट की लाइनों को पढ़ने की भी आवश्यकता है। 'बफर' की प्रकृति और यूटीएफ -8 जैसे एन्कोडेड टेक्स्ट में कनवर्ट करने की आवश्यकता के कारण 'fs.read' का उपयोग करके टेक्स्ट की एक पंक्ति को पढ़ने में बहुत मुश्किल लगती है। UTF-8 के बाद से टूटी वर्णों में स्पष्ट तरीके परिणामस्वरूप मल्टीबाइट वर्ण शामिल हैं। 'पठनीयस्ट्रीम' मल्टीबाइट वर्णों को संभालता है, लेकिन किसी को स्वतंत्र रूप से खोजने की अनुमति नहीं देता है। मुझे यकीन नहीं है कि कोई पुस्तकालय है जो आपको यादृच्छिक पहुंच और रेखा पढ़ने को गठबंधन करने देता है। – hippietrail

2

नोड इन में बनाया निकटतम आप प्राप्त कर सकते हैं एक start पैरामीटर के साथ fs.createReadStream उपयोग करने के लिए से एक ऑफसेट पढ़ना शुरू करने के लिए है नहीं है,, (एक मौजूदा fd में पारित फ़ाइल फिर से खोलने से बचने के लिए)।

http://nodejs.org/api/fs.html#fs_fs_createreadstream_path_options

+0

जब तक यह पता चला है धीमा हो यह एक आदर्श समाधान की तरह लगता है। यह एक एफडी से रीडस्ट्रीम बनाने की लागत पर निर्भर हो सकता है। – hippietrail

+0

क्या मुझे हर बार 'createReadStream()' को कॉल करने पर भी उसी पथ पैरामीटर में पास करने की आवश्यकता है? 'पथ' अनिवार्य है जबकि 'एफडी' सिर्फ वैकल्पिक है और दस्तावेज़ स्पष्ट नहीं हैं। – hippietrail

+0

एचएम ... क्या आपने पथ के लिए 'शून्य' में गुजरने का प्रयास किया है, भले ही यह कहता है कि यह आवश्यक है? अन्यथा मैं बस एक ही रास्ते में गुजरना होगा। – yiding

1

मुझे लगता है कि createReadStream नई फ़ाइल वर्णनकर्ता अधिक से अधिक बनाता है लगता है।

function FileBuffer(path) { 
const fd = fs.openSync(path, 'r'); 

function slice(start, end) { 
    const chunkSize = end - start; 
    const buffer = new Buffer(chunkSize); 

    fs.readSync(fd, buffer, 0, chunkSize, start); 

    return buffer; 
} 

function close() { 
    fs.close(fd); 
} 

return { 
    slice, 
    close 
} 

}

संबंधित मुद्दे