最近standというバックアップツールを書いてるんですが、詳しくはこちら

その途中で、zip,tar化するときにディレクトリの再帰処理を忘れてて、再帰処理を書きだした時に気付いた問題と、解決方法を書き残します。

zip , tar はこれらを使ってます。 * archive/tar * archive/zip

再帰処理自体は問題はなかったんですが、空ディレクトリ問題が発生しました。。。 どんな問題かというと、空ディレクトリを圧縮すると展開出来ない…という問題です。

結果としては、/path/to/target/dir として圧縮するのではなく、
/path/to/target/dir/ と末尾に / と書くことで、内部的にディレクトリとしてみなしてくれる様になった。

なんでや….

なので圧縮処理部分ではなく、その前に圧縮対象リストを作成する部分に手を加える事で、再帰的に圧縮ファイルを作れるようになりました。 そして、最終的に出来上がったコードがこちら 圧縮処理は今回は書いてません

func find(targetDir string) ([]string, error) {

    var paths []string
    err := filepath.Walk(targetDir,
        func(path string, info os.FileInfo, err error) error {
            rel, err := filepath.Rel(targetDir, path)
            if err != nil {
                return err
            }

      //ディレクトリの場合は、/を末尾につける
            if info.IsDir() {
                paths = append(paths, fmt.Sprintf("%s/", rel))
                return nil
            }

            paths = append(paths, rel)
            return nil
        })

    if err != nil {
        return nil, err
    }

    return paths, nil
}

指定したディレクトリ以下のファイル、ディレクトリパスを再帰的に[]string 化して返却する関数です。

とりあえずこれで引き続き開発出来そう。