我正在从事的项目(Node.js)意味着对文件系统的大量操作(复制、读取、写入等)。
哪种方法是最快的?
我正在从事的项目(Node.js)意味着对文件系统的大量操作(复制、读取、写入等)。
哪种方法是最快的?
当前回答
通常避免异步文件操作是很好的。以下是一个简短的(即没有错误处理)同步示例:
var fs = require('fs');
fs.writeFileSync(targetFile, fs.readFileSync(sourceFile));
其他回答
使用Node.js内置的复制函数
它提供了异步和同步版本:
const fs = require('fs');
// File "destination.txt" will be created or overwritten by default.
fs.copyFile('source.txt', 'destination.txt', (err) => {
if (err)
throw err;
console.log('source.txt was copied to destination.txt');
});
fs。copyFileSync(src, dest[, mode])
使用标准的内置方式fs.copyFile:
const fs = require('fs');
// File destination.txt will be created or overwritten by default.
fs.copyFile('source.txt', 'destination.txt', (err) => {
if (err) throw err;
console.log('source.txt was copied to destination.txt');
});
如果你必须支持老版本的Node.js -下面是你如何在不支持fs.copyFile的版本中做到这一点:
const fs = require('fs');
fs.createReadStream('test.log').pipe(fs.createWriteStream('newLog.log'));
对于快速复制,您应该使用fs.常量。COPYFILE_FICLONE国旗。它允许(对于支持此功能的文件系统)不实际复制文件的内容。只创建了一个新的文件条目,但它指向源文件的写时复制“克隆”。
什么都不做/少做是做某事的最快方法;)
https://nodejs.org/api/fs.html#fs_fs_copyfile_src_dest_flags_callback
let fs = require("fs");
fs.copyFile(
"source.txt",
"destination.txt",
fs.constants.COPYFILE_FICLONE,
(err) => {
if (err) {
// TODO: handle error
console.log("error");
}
console.log("success");
}
);
用承诺代替:
let fs = require("fs");
let util = require("util");
let copyFile = util.promisify(fs.copyFile);
copyFile(
"source.txt",
"destination.txt",
fs.constants.COPYFILE_FICLONE
)
.catch(() => console.log("error"))
.then(() => console.log("success"));
你可以使用fs-extra模块很容易地做到这一点:
const fse = require('fs-extra');
let srcDir = 'path/to/file';
let destDir = 'pat/to/destination/directory';
fse.moveSync(srcDir, destDir, function (err) {
// To move a file permanently from a directory
if (err) {
console.error(err);
} else {
console.log("success!");
}
});
Or
fse.copySync(srcDir, destDir, function (err) {
// To copy a file from a directory
if (err) {
console.error(err);
} else {
console.log("success!");
}
});
您可能想要使用async/await,因为节点v10.0.0可以使用内置的fs Promises API。
例子:
const fs = require('fs')
const copyFile = async (src, dest) => {
await fs.promises.copyFile(src, dest)
}
注意:
从节点v11.14.0到v10.17.0, API不再是实验性的。
更多信息:
承诺API
承诺拷贝文件