我正在从事的项目(Node.js)意味着对文件系统的大量操作(复制、读取、写入等)。
哪种方法是最快的?
我正在从事的项目(Node.js)意味着对文件系统的大量操作(复制、读取、写入等)。
哪种方法是最快的?
当前回答
迈克的解决方案,但承诺:
const FileSystem = require('fs');
exports.copyFile = function copyFile(source, target) {
return new Promise((resolve,reject) => {
const rd = FileSystem.createReadStream(source);
rd.on('error', err => reject(err));
const wr = FileSystem.createWriteStream(target);
wr.on('error', err => reject(err));
wr.on('close', () => resolve());
rd.pipe(wr);
});
};
其他回答
通常避免异步文件操作是很好的。以下是一个简短的(即没有错误处理)同步示例:
var fs = require('fs');
fs.writeFileSync(targetFile, fs.readFileSync(sourceFile));
Mike Schilling的错误处理解决方案,为错误事件处理程序提供了一个快捷方式。
function copyFile(source, target, cb) {
var cbCalled = false;
var rd = fs.createReadStream(source);
rd.on("error", done);
var wr = fs.createWriteStream(target);
wr.on("error", done);
wr.on("close", function(ex) {
done();
});
rd.pipe(wr);
function done(err) {
if (!cbCalled) {
cb(err);
cbCalled = true;
}
}
}
我写了一个小工具来测试不同的方法:
https://www.npmjs.com/package/copy-speed-test
运行它
npx copy-speed-test --source someFile.zip --destination someNonExistentFolder
它使用child_process.exec()进行本地复制,使用fs进行复制文件。它使用creatererestream和各种不同的缓冲区大小(您可以通过在命令行上传递它们来更改缓冲区大小)。执行NPX copy-speed-test -h查看更多信息)。
相同的机制,但这增加了错误处理:
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(wr);
function done(err) {
if (!cbCalled) {
cb(err);
cbCalled = true;
}
}
}
我不能得到creatererestream /createWriteStream方法工作的一些原因,但使用fs-额外的npm模块它马上工作。但我不确定性能上的差异。
保存fs-extra
var fs = require('fs-extra');
fs.copySync(path.resolve(__dirname, './init/xxx.json'), 'xxx.json');