メインコンテンツへスキップ
【Golang】zip内のファイル一覧を展開せずに取得する

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

··2 分
Programming Golang
かずさプログラマー
著者
かずさプログラマー
業務の作業自動化を行っています。Go、VBA、Pythonを主に使用しています。過去にはC#、VB.Net、JavaScriptも使用していました。
目次

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

関連記事

【Golang】Collyを使用してWebスクレイピングを行う
··5 分
Programming Golang
Robotgoで指定範囲のキャプチャーを連続で取得する
·1 分
Programming Golang
Robotgoで自動操作
··3 分
Programming Golang