🦕

denoで現在のディレクトリ以下にあるフォルダごとにzip圧縮するコードを書いてみた

2021/12/01に公開

お約束

この記事は medibaアドベントカレンダー 2021 2日目の記事です

medibaのテクノロジーセンターでネイティブアプリエンジニアをやっています、佐藤よしあきです

動機

色々とコード書き散らかしてると、ちょっとしたネタごとに作ったディレクトリでコード置き場が酷いことになりますよね
整理したいんだけどまとめてアーカイブしちゃうと検索できないので、せめてディレクトリ名では検索できるようにしたい→ディレクトリごとにzip作ればよくね?→標準のアーカイバで対応してるの少なくね?→じゃあ作るか

コレが

↓こうなる

せっかくなのでdenoで、denoさえあれば動く状態にしてみました
※ 元は Deno.exec()zipを呼び出すとかいう剛毅な作りだった

コード

archiveEachDirectory.ts
// deno run --allow-read --allow-write archiveEachDirectory.ts
import { walk } from "https://deno.land/std/fs/mod.ts";
import { JSZip } from "https://deno.land/x/jszip/mod.ts";

for await (const dirEntry of Deno.readDir("./")) {
    if (dirEntry.isDirectory == true && dirEntry.isSymlink == false) {
        console.log(`zipping ${dirEntry.name} ....`);

        const zip = new JSZip();
        for await (const e of walk(dirEntry.name)) {
            if (e.isFile) {
                const binary = await Deno.readFile(e.path);
                zip.addFile(e.path, binary, { binary: true, compression: `DEFLATE` });
                console.log(`add file: ${e.path}`)
            }
            if (e.isDirectory) {
                zip.folder(e.path);
                console.log(`add directory: ${e.path}`)
            }
        }
        console.log(`finalizing  ${dirEntry.name}.zip ....`);
        await zip.writeZip(`${dirEntry.name}.zip`);
        console.log(`${dirEntry.name} archive -> ${dirEntry.name}.zip`);
    }
}

メモ

最後の JSZip.writeZip() がものすんごい遅いのは何が原因なんだろうか、JavaScriptだからだろうか

お約束

medibaでは事業の拡大や多角化に当たって、幅広い職種を募集中です
様々なフィールドがありますので、一度お話を聞きに来てみて下さい
https://hrmos.co/pages/mediba/jobs

Discussion