概述目录同步需要遍历与对比。本文给出按名称与最后修改时间同步的示例。遍历与对比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();
}

发表评论 取消回复