繁体   English   中英

如何使用 fs.copyFile 节点复制多个文件?

[英]How to copy multiple files using fs.copyFile node?

我正在使用fs.copyFile将文件从一个位置复制到另一个位置。 我这样做两次是为了复制两个文件。 这是多余的,我想通过一次调用将两个文件复制到目标来使我的代码更好? 我怎样才能做到这一点?

fs.copyFile('src/blah.txt', 'build/blah.txt', (err) => {
        if (err) throw err;
});
fs.copyFile('src/unk.txt', 'build/unk.txt', (err) => {
        if (err) throw err;
});

您可以简单地创建自己的函数,该函数将 src 和 dest 路径以及文件名数组作为参数:

const util = require('util');
const fs = require('fs');
const path = require('path');
const copyFilePromise = util.promisify(fs.copyFile);

function copyFiles(srcDir, destDir, files) {
    return Promise.all(files.map(f => {
       return copyFilePromise(path.join(srcDir, f), path.join(destDir, f));
    }));
}

// usage
copyFiles('src', 'build', ['unk.txt', 'blah.txt']).then(() => {
   console.log("done");
}).catch(err => {
   console.log(err);
});

可能最好的选择是使用fs-extra

const fse = require('fs-extra');

const srcDir = `path/to/file`;
const destDir = `path/to/destination/directory`;

// To copy a folder
fse.copySync(srcDir, destDir, function (err) {
  if (err) {
    console.error(err);
  } else {
    console.log("success!");
  }
});
   const fs = require('fs');
const path = require('path');
const files = ['/files/a.js', '/files/b.js', '/files/c.txt'];
files.forEach(file => {
  fs.copyFile(path.join(__dirname + file), path.join(__dirname + '/files/backup/' + path.basename(file)), err => {
    if(!err){
    console.log(file + " has been copied!");
  }
  })

});

如果不需要强制替换,请使用以下代码。

    const fs = require('fs');
        const path = require('path');
        const files = ['/files/a.js','/files/b.js','/files/c.txt'];   
          files.forEach(file => {
    let basename = path.basename(file);
    let oldFile = path.join(__dirname+file);
    let newFile = path.join(__dirname+'/files/backup/'+basename);
    if (!fs.existsSync(newFile)) {
      fs.copyFile(oldFile, newFile, err=>{
        if(!err){
          console.log(basename+" has been copied!");
        }
      });
    }else{
      console.log(basename+" already existed!");
    }
  });

这就是我使用 walk npm 包实现上述功能以获取所有文件的方式。

https://www.npmjs.com/package/walk

这也会获取子文件夹中的所有文件。

将 16,000 张图像从我的 Go Pro 复制到我桌面上的一个文件夹中。

const util = require('util');

const fs = require('fs');

const path = require('path');

const copyFilePromise = util.promisify(fs.copyFile);

const walk = require('walk');

let files = [];

let source_folder = '/Volumes/Untitled/DCIM';

let destination_folder = '/Users/dave/Desktop/pics';

let walker = walk.walk(source_folder, {
    followLinks: false
});

walker.on('file', function(root, stat, next) {

    let file_path = root + '/' + stat.name;

    files.push({
        src: file_path,
        des: destination_folder + '/' + stat.name
    });

    next();

});

walker.on('end', function() {

    copyFiles(files).then(() => {

        console.log("done");

    }).catch(err => {

        console.log(err);

    });

});

function copyFiles(files) {
    return Promise.all(files.map(f => {
        return copyFilePromise(f.src, f.des);
    }));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM