はじめに
ディレクトリ内のファイル一覧を取得する方法を調べると、3つ見つかったので備忘録として残しておきます。
前提
確認のため、最小構成で実行しています。今回は以下のような場面での使用を想定しています。
% tree
.
├── input
│ ├── abc.jpeg
│ ├── folder
│ │ └── in_folder.jpg
│ └── test.jpg
└── main.go
方法
ioutil.ReadDir
ReadDir
で指定したディレクトリを読み込み、ファイル名でソートし、表示されます。サブディレクトリ内のファイルは表示されません。
main.go
package main
import (
"fmt"
"io/ioutil"
)
func main() {
files, _ := ioutil.ReadDir("input")
for _, f := range files {
fmt.Println(f.Name())
}
}
% go run main.go
abc.jpg false
folder true
test.jpg false
filepath.Walk
指定したディレクトリ内すべてのファイルをリストしたい場合はfilepath.Walk
がおすすめ。自動的にサブディレクトリ内のファイルまで表示してくれます。
main.go
package main
import (
"fmt"
"os"
"path/filepath"
)
func main() {
err := filepath.Walk("input", func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
fmt.Printf("dir: %v name: %s\n", info.IsDir(), path)
return nil
})
if err != nil {
fmt.Println(err)
}
}
% go run main.go
dir: true name: input
dir: false name: input/abc.jpg
dir: true name: input/folder
dir: false name: input/folder/in_folder.jpg
dir: false name: input/test.jpg
os.File.Readdir
指定されたディレクトリからディレクトリ順にファイルリストを表示してくれる。
同じファイルを続けて呼び出すとFileInfoが返ってくるらしい。(ここは未調査)
main.go
package main
import (
"fmt"
"os"
)
func main() {
f, _ := os.Open("input")
files, _ := f.Readdir(0)
for _, v := range files {
fmt.Println(v.Name(), v.IsDir())
}
}
% go run main.go
folder true
test.jpg false
abc.jpeg false
さいごに
os.File.Readdir
の挙動についてはもう少し理解しておきたいと思った。
参考