gpt4 book ai didi

node.js - 在 Node.js 中使用进度信息快速复制文件?

转载 作者:搜寻专家 更新时间:2023-10-31 22:19:55 25 4
gpt4 key购买 nike

有没有机会使用 Node.js 复制带有进度信息和快速的大文件?

解决方案 1:fs.createReadStream().pipe(...) = 无用,最多比原生 cp 慢 5

参见:Fastest way to copy file in node.js ,进度信息是可能的(使用 npm package 'progress-stream' ):

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

这种方式的唯一问题是,与“cp source dest”相比,它很容易花费 5 倍的时间。另请参阅下面的附录以获取完整的测试代码。

解决方案 2:rsync ---info=progress2 = 与解决方案 1 一样慢 = 无用

解决方案 3:我的最后一招是,使用“CoreUtils”(cp 和其他的 linux 源代码)或其他函数为 node.js 编写 native 模块,如 Fast file copy with progress 中所示。

有谁比解决方案 3 更了解?我想避免使用 native 代码,但它似乎最合适。

谢谢!欢迎任何包推荐或提示(尝试了所有 fs**)!

附录:

测试代码,使用管道和进度:

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);

更新:一个快速的(有详细的进展!)C 版本在这里实现:https://github.com/MidnightCommander/mc/blob/master/src/filemanager/file.c#L1480 .似乎是最好的去处:-)

最佳答案

可能会减慢进程的一个方面与 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 文件的执行时间:

console.log: 692.950ms

没有 console.log:382.540ms

关于node.js - 在 Node.js 中使用进度信息快速复制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34142211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com