NodeJS - 如何将一个文件夹复制到另一个文件夹,只覆盖不同的文件?

时间:2017-10-18 01:24:08

标签: node.js directory copy rsync fs-extra

问题:

如何在NodeJS中将一个文件夹复制到另一个文件夹,只覆盖不同的文件?

关于fs-extra“复制”方法:

来自copyfs-extra方法似乎无法跳过相同的文件(未经过任何修改)。

overwrite选项,但它只允许您选择在所有情况下覆盖,即使文件相同或不覆盖,即使文件不同。

2 个答案:

答案 0 :(得分:0)

我找到了mattijs/node-rsyncjedrichards/rsyncwrapper,两者都表现良好并在Linux / Windows /等中运行。

为了方便和自由选择,我决定坚持第二种选择。

示例(自述文件中描述了更多选项)

单个文件:

rsync({
    src: "file.txt",
    dest: "tmp/file.txt"
},function (error,stdout,stderr,cmd) {
    if ( error ) {
        // failed
        console.log(error.message);
    } else {
        // success
    }
});

完整目录:

rsync({
    src: "src-folder/",
    dest: "dest-folder",
    recursive: true,
    exclude: ["*.txt"]
},function (error,stdout,stderr,cmd) {
    if ( error ) {
        // failed
        console.log(error.message);
    } else {
        // success
    }
});

答案 1 :(得分:0)

我创建了一个名为 Reflect -https://github.com/alumna/reflect

的开源nodejs库。

我对前面提到的两个库都依赖于rsync 这个事实感到不满意,这不是一个多平台的决定,因为Windows本身并不提供rsync。

我用纯JavaScript来实现Reflect来解决此问题,而不依赖rsync或任何其他库,使其适合所有操作系统。

仅需注意:Reflect与rsync类似地比较文件,并且仅同步两个文件夹之间的差异,从而完全避免了复制未修改的文件(或已修改但仍相同的文件),但是它仍然不适合包含大文件的项目,因为它会在不同时复制整个文件。


安装

$ npm install @alumna/reflect

用法

import reflect from '@alumna/reflect';

let { res, err } = await reflect({

    src: 'src/',
    
    dest: 'dest/',
    
    // (OPTIONAL) Default to 'true'
    recursive: true,
    
    // (OPTIONAL) Default to 'true'
    // Delete in dest the non-existent files in src
    delete: true,
    
    // (OPTIONAL)
    // Array with files and folders not to reflect
    exclude: [ "skip-this-file.txt", "skip/this/directory" ]
    
});

if ( err )
    console.error( err )

else
    console.log( res ) // Directory "src/" reflected to "dest/"