概述目录同步需要遍历与对比。本文给出按名称与最后修改时间同步的示例。遍历与对比async function* walk(dir, base = '') {

for await (const [name, handle] of dir.entries()) {

const p = base ? base + '/' + name : name;

if (handle.kind === 'file') yield { path: p, handle };

else yield* walk(await dir.getDirectoryHandle(name), p);

}

}

async function syncDirs() {

const src = await window.showDirectoryPicker();

const dst = await window.showDirectoryPicker();

const srcMap = new Map();

for await (const { path, handle } of walk(src)) {

const f = await handle.getFile();

srcMap.set(path, f.lastModified);

}

for await (const { path, handle } of walk(dst)) {

const f = await handle.getFile();

const sm = srcMap.get(path);

if (sm && sm > f.lastModified) {

await copyFile(src, dst, path);

}

}

}

async function copyFile(srcDir, dstDir, path) {

const seg = path.split('/');

let s = srcDir; let d = dstDir;

for (let i=0;i<seg.length-1;i++) { s = await s.getDirectoryHandle(seg[i]); d = await d.getDirectoryHandle(seg[i], { create: true }); }

const srcFile = await (await s.getFileHandle(seg[seg.length-1])).getFile();

const dfh = await d.getFileHandle(seg[seg.length-1], { create: true });

const w = await dfh.createWritable();

await w.write(await srcFile.arrayBuffer());

await w.close();

}

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部