【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
10│
11└─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