ファイル処理において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