2
1

More than 1 year has passed since last update.

Go言語でディレクトリ内のファイルを取得する方法

Posted at

はじめに

ディレクトリ内のファイル一覧を取得する方法を調べると、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の挙動についてはもう少し理解しておきたいと思った。

参考

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1