3.0.0 • Published 4 years ago
@definejs/sync-files v3.0.0
@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();