2015-12-07 4 views
6

वहाँ प्रगति infos और तेजी के साथ Node.js साथ बड़ी फ़ाइलों को कॉपी करने के लिए कोई मौका है?फास्ट फ़ाइल Node.js में प्रगति की जानकारी के साथ नकल?

समाधान 1:। Fs.createReadStream() पाइप (...) बेकार =, 5 देशी सीपी

देखें तुलना में धीमी करने के लिए: Fastest way to copy file in node.js, NPM पैकेज 'के साथ प्रगति के बारे में जानकारी के लिए संभव है (progress- स्ट्रीम '):

fs = require('fs'); 
    fs.createReadStream('test.log').pipe(fs.createWriteStream('newLog.log')); 

इस तरह की एकमात्र समस्या यह है कि यह "सीपी स्रोत dest" की तुलना में 5 गुना अधिक आसानी से लेता है। पूर्ण परीक्षण कोड के लिए नीचे परिशिष्ट भी देखें।

समाधान 2: rsync --- जानकारी = progress2 = एक ही धीमी गति से समाधान के रूप में 1 = बेकार

समाधान 3: मेरा अंतिम उपाय, Node.js के लिए एक देशी मॉड्यूल, का उपयोग करते हुए लिखते हैं "coreutils" या अन्य कार्यों (सीपी और दूसरों के लिए linux सूत्रों) के रूप में Fast file copy with progress

में दिखाया गया है किसी को भी समाधान 3 से बेहतर जानता है करता है? मैं देशी कोड से बचना चाहता हूं लेकिन यह सबसे अच्छा फिट लगता है।

धन्यवाद! किसी भी पैकेज सिफारिशों या संकेत (सभी एफएस ** की कोशिश की) स्वागत है!

परिशिष्ट:

परीक्षण कोड, पाइप और प्रगति का उपयोग कर:

var path = require('path'); 
var progress = require('progress-stream'); 
var fs = require('fs'); 
var _source = path.resolve('../inc/big.avi');// 1.5GB 
var _target= '/tmp/a.avi'; 

var stat = fs.statSync(_source); 
var str = progress({ 
    length: stat.size, 
    time: 100 
}); 

str.on('progress', function(progress) { 
    console.log(progress.percentage); 
}); 

function copyFile(source, target, cb) { 
    var cbCalled = false; 


    var rd = fs.createReadStream(source); 
    rd.on("error", function(err) { 
     done(err); 
    }); 

    var wr = fs.createWriteStream(target); 

    wr.on("error", function(err) { 
     done(err); 
    }); 

    wr.on("close", function(ex) { 
     done(); 
    }); 

    rd.pipe(str).pipe(wr); 

    function done(err) { 
     if (!cbCalled) { 
      console.log('done'); 
      cb && cb(err); 
      cbCalled = true; 
     } 
    } 
} 
copyFile(_source,_target); 

अद्यतन: एक तेजी से (! विस्तृत प्रगति के साथ) सी संस्करण यहां लागू किया गया है: https://github.com/MidnightCommander/mc/blob/master/src/filemanager/file.c#L1480। कि नीचे प्रक्रिया console.log से संबंधित है को धीमा कर सकता से :-)

+0

है । आप या तो घुरघुराना (घुरघुराना-योगदान कॉपी का प्रयोग करके) या सिर्फ एक सरल 'की आवश्यकता होती है ('child_process') कार्यकारी ('सीपी स्रोत गंतव्य') की कोशिश की,'? – jperezov

+0

आपका लक्ष्य वास्तव में क्या है? नोड संभवतः कभी भी 'सीपी' जैसे मूल उपकरण के रूप में तेज़ नहीं होगा, इसलिए आपके पास एक विशिष्ट कारण होना चाहिए कि आप इसे इस तरह कार्यान्वित क्यों करना चाहते हैं? – robertklep

+0

@jperezov हाँ, इसकी भी सभी दूसरों के रूप में कर रही है। प्रगति अच्छी है, हाँ! – xamiro

उत्तर

1

एक पहलू यह जाने के लिए सबसे अच्छी जगह लगता है। इस कोड में एक नज़र डालें:

console.log साथ

:

const fs = require('fs'); 
const sourceFile = 'large.exe' 
const destFile = 'large_copy.exe' 

console.time('copying') 
fs.stat(sourceFile, function(err, stat){ 
    const filesize = stat.size 
    let bytesCopied = 0 

    const readStream = fs.createReadStream(sourceFile) 

    readStream.on('data', function(buffer){ 
    bytesCopied+= buffer.length 
    let porcentage = ((bytesCopied/filesize)*100).toFixed(2) 
    console.log(porcentage+'%') // run once with this and later with this line commented 
    }) 
    readStream.on('end', function(){ 
    console.timeEnd('copying') 
    }) 
    readStream.pipe(fs.createWriteStream(destFile)); 
}) 

यहाँ एक 400MB फ़ाइल की प्रतिलिपि बनाते निष्पादन समय हैं 692.950ms

console.log बिना: 382.540ms

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