返回

文件复制,node 中有哪些“曲线救国”的方法?

前端

流式复制

流式复制是解决大文件复制内存问题的一种常用方法。它通过流的形式,将文件的内容从一个地方传输到另一个地方,而不需要将整个文件加载到内存中。在 Node.js 中,我们可以使用 fs.createReadStream()fs.createWriteStream() 来创建流,并使用 pipe() 方法将它们连接起来。这样,当文件的内容从一个流流向另一个流时,它们就会被复制。

const fs = require('fs');

const inputFile = 'large-file.txt';
const outputFile = 'copy-of-large-file.txt';

const readStream = fs.createReadStream(inputFile);
const writeStream = fs.createWriteStream(outputFile);

readStream.pipe(writeStream);

readStream.on('end', () => {
  console.log('File copied successfully!');
});

管道复制

管道复制是流式复制的一种特殊情况,它使用操作系统的管道机制来实现文件复制。在 Node.js 中,我们可以使用 child_process.exec()child_process.spawn() 来创建管道。

const { exec } = require('child_process');

const inputFile = 'large-file.txt';
const outputFile = 'copy-of-large-file.txt';

const command = `cat ${inputFile} > ${outputFile}`;

exec(command, (err, stdout, stderr) => {
  if (err) {
    console.error(err);
  } else {
    console.log('File copied successfully!');
  }
});

硬链接

硬链接是文件系统中的一种特殊文件,它指向另一个文件。这意味着,当我们对一个硬链接进行修改时,另一个文件也会被修改。在 Node.js 中,我们可以使用 fs.link() 来创建硬链接。

const fs = require('fs');

const inputFile = 'large-file.txt';
const outputFile = 'copy-of-large-file.txt';

fs.link(inputFile, outputFile, (err) => {
  if (err) {
    console.error(err);
  } else {
    console.log('File copied successfully!');
  }
});

符号链接

符号链接是文件系统中另一种特殊文件,它指向另一个文件或目录。与硬链接不同的是,符号链接不会影响另一个文件或目录。在 Node.js 中,我们可以使用 fs.symlink() 来创建符号链接。

const fs = require('fs');

const inputFile = 'large-file.txt';
const outputFile = 'copy-of-large-file.txt';

fs.symlink(inputFile, outputFile, (err) => {
  if (err) {
    console.error(err);
  } else {
    console.log('File copied successfully!');
  }
});

以上是几种在 Node.js 中复制文件时可以使用的“曲线救国”的方法。这些方法各有优缺点,大家可以根据自己的实际情况选择合适的方法。