3.0.0 • Published 4 years ago

@definejs/sync-files v3.0.0

Weekly downloads
-
License
MIT
Repository
github
Last release
4 years ago

@definejs/sync-files

基于 MD5 的文件同步工具,把源目录的文件和目录结构同步到目标目录中。

用 MD5 对文件内容进行计算,MD5 值相同的文件被认为是同一个文件,尽管它们的文件名可能不同。
同步后,目标目录的目录结构和文件列表就保持跟源目录完全一致。

同步过程中: 对源目录完全是无伤害的,即不会对源目录有任何的删除、修改、新增文件/目录的操作,仅仅把它当成一个数据源进行读取。
对目标目录可能存在以下操作:

  • 删除多余的文件或目录;当 target 目录有某个文件或目录,而 source 目录没有此文件或目录时。
  • 复制新增的文件或目录;当 source 目录有某个文件或目录,而 target 目录没有此文件或目录时。
  • 重命名已有的文件;当 source 目录有某个文件,target 目录也存在此文件,但对应的目录位置、文件名不同时。

同步过程中,会对源目录和目标目录的文件进行 MD5 计算,为了方便下次可以直接使用本次的计算结果,会在当前的源目录和目标目录创建一个隐藏的子目录 .sync-files 以保存 MD5 的计算结果。

每次计算文件的 MD5 时,都会先从目录 .sync-files 目录读取,如果存在对应的记录,则直接使用,不再重复计算当前文件的 MD5。
如果不存在,则计算当前文件的 MD5 值,并且会把结果缓存起来。 用户可以直接删除 .sync-files 目录,则会重新计算 MD5。

示例

使用默认设置

const { parse, sync, } = require('@definejs/sync-files');

//仅对指定目录进行解析,生成 MD5 元数据库。
parse('/Users/micty/Pictures/Canon');

//进行完整的同步流程,包括解析、同步、清理、校验。
sync({
    //要进行同步的来源目录。
    //不会对此目录有任何的删除、修改等操作,仅仅把它当成数据源进行读取。
    source: '/Users/micty/Pictures/Canon',

    //要进行同步的目标目录。
    //进行同步时,可能会对此目录进行以下操作:
    //一,删除多余的文件;当目标目录有某个文件,而源目录没有此文件时。
    //二,复制新增的文件;当源目录有某个文件,而目标目录没有此文件时。
    //三,重命名已有的文件;当源目录有某个文件,目标目录也存在此文件,但对应的目录位置、文件名不同时。
    target: '/Volumes/3/Canon',
});

自定义方式

const { Task, } = require('@definejs/sync-files');

let task = new Task({
    //会话过程中产生的日志等临时文件的存放目录。 
    //建议每次都使用一个不同的目录,以方便多次运行后进行查找和对比。
    //如果不指定,则不输出临时文件。
    home: `./output/2021-12-21/`,   

    //会话过程中产生的日志的文件名称。 
    //如果指定,则输出到此文件中;否则仅在控制台输出。
    //此文件名是在 home 目录中。
    console: 'console.log',

    //解析过程中提取文件 MD5 等元数据后要保存到目录名,建议指定为 `.sync-files/`。
    //如果不指定,则不保存元数据。
    //为了使用下次的解析更快,建议开启缓存。
    //此目录是在 source 和 target 对应的目录中。
    cache: '.sync-files/',

    //要进行同步的来源目录。
    //同步过程中不会对此目录有任何的删除、修改等操作,仅仅把它当成数据源进行读取。
    //如果指定了 cache 字段,则会在此目录中生成 cache 目录。
    source: '/Users/micty/Pictures/Canon',

    //要进行同步的目标目录。
    //进行同步时,可能会对此目录进行以下操作:
    //一,删除多余的文件;当目标目录有某个文件,而源目录没有此文件时。
    //二,复制新增的文件;当源目录有某个文件,而目标目录没有此文件时。
    //三,重命名已有的文件;当源目录有某个文件,目标目录也存在此文件,但对应的目录位置、文件名不同时。
    //如果指定了 cache 字段,则会在此目录中生成 cache 目录。
    target: '/Volumes/3/Canon',
});

task.parse();
task.sync();
task.clear();
task.verify();