繁体   English   中英

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

[英]NodeJS - How to copy one folder to another, overwriting only files that differ?

问题:

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


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

似乎fs-extra复制方法没有跳过相同文件(未经过任何修改)的选项。

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

过时的答案。 请参阅反映答案。


我发现mattijs/node-rsyncjedrichards/ rsyncwrapper ,它们都表现良好并且在 Linux/ Windows */etc 中运行。

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


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

单个文件:

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
    }
});

我创建了一个开源的 nodejs 库,名为Reflect - https://github.com/alumna/reflect

我对前面提到的两个库都依赖于 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/"

我将在这里澄清“复制/合并文件夹”和“同步/镜像文件夹”操作之间的区别。

如果是两个随机文件夹,不阅读它们的内容就无法知道两个文件是否相同,例如修改时间和文件大小之类的事情可能是巧合的。 这就是fs-extra没有这种覆盖选项的原因。

如果打算将两个文件夹作为它们的镜像,那么您可能会对它们内部的世界状态更加乐观,并通过比较文件的修改时间并仅复制最近更改的文件来加快速度。 但仍然按照设计,这个解决方案不能 100% 防弹。 只是让你知道:)

暂无
暂无

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

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