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

发表评论 取消回复