【Golang】zip内のファイル一覧を展開せずに取得する

ファイル処理においてzipファイルを解凍してから中身を取得することが一般的ですが、
今回は展開せずにzip内のファイル一覧を取得してみます。
Golangでは標準パッケージのarchive/zipを使用します。

zip内のファイル一覧を取得するコード

読み取り対象のzipファイルの内容

下記のようなTestZip.zipを用意しました

 1TestZip.zip
 2 3├─SubFolder1
 4│  └─text1.txt
 5│  └─text2.txt
 6 7├─SubFolder2
 8│  └─text3.txt
 9│  └─text4.txt
1011└─text5.txt

zip内にファイルとフォルダが圧縮されているので、フォルダ名とファイル名を表示してみます。

zipファイルの内容を一覧表示するコード

下記のコードはzipファイルの内容を展開せずに、ファイル一覧を表示するコードです。

 1package main
 2
 3import (
 4	"archive/zip"
 5	"fmt"
 6	"log"
 7)
 8
 9func main() {
10	files, err := showFilesInZip("TestZip.zip")
11	if err != nil {
12		log.Fatal(err)
13	}
14
15	for _, file := range files {
16		fmt.Println(file)
17	}
18}
19
20func showFilesInZip(zipName string) ([]string, error) {
21	r, err := zip.OpenReader(zipName)
22	if err != nil {
23		return nil, err
24	}
25	defer r.Close()
26
27	var fileNames []string
28	for _, f := range r.File {
29		fileNames = append(fileNames, f.Name)
30	}
31
32	return fileNames, nil
33}

showFilesInZip関数内でzip.OpenReaderを使用して、指定したzipファイルを開いています。
もしファイルが見つからない場合や開く時にエラーが発生した場合はエラーを返します。

その後、取得したzipファイルの中身にアクセスするためにFileのスライスを使用します。
FileにはFileHeaderが埋め込まれているので、FileHeaderのNameフィールドを利用してファイル名を取得します。

最後に取得したファイル名をstringのスライスに格納して関数から返しています。

コードを実行するとzipファイルを読み込み、zipファイル内のフォルダとファイル一覧が表示されます。

1TestZip/SubFolder1/
2TestZip/SubFolder1/text1.txt
3TestZip/SubFolder1/text2.txt
4TestZip/SubFolder2/
5TestZip/SubFolder2/text3.txt
6TestZip/SubFolder2/text4.txt
7TestZip/text5.txt

関連ページ