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

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

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

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

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

TestZip.zip
├─SubFolder1
│  └─text1.txt
│  └─text2.txt
├─SubFolder2
│  └─text3.txt
│  └─text4.txt
└─text5.txt

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

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

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

package main

import (
	"archive/zip"
	"fmt"
	"log"
)

func main() {
	files, err := showFilesInZip("TestZip.zip")
	if err != nil {
		log.Fatal(err)
	}

	for _, file := range files {
		fmt.Println(file)
	}
}

func showFilesInZip(zipName string) ([]string, error) {
	r, err := zip.OpenReader(zipName)
	if err != nil {
		return nil, err
	}
	defer r.Close()

	var fileNames []string
	for _, f := range r.File {
		fileNames = append(fileNames, f.Name)
	}

	return fileNames, nil
}

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

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

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

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

TestZip/SubFolder1/
TestZip/SubFolder1/text1.txt
TestZip/SubFolder1/text2.txt
TestZip/SubFolder2/
TestZip/SubFolder2/text3.txt
TestZip/SubFolder2/text4.txt
TestZip/text5.txt
Licensed under CC BY-NC-SA 4.0
最終更新 2023年11月29日 18:15
Hugo で構築されています。
テーマ StackJimmy によって設計されています。