Go言語でディレクトリをイテレートする方法を教えて下さい。
Goでディレクトリを走査するには、filepath.Walk関数が使えるほか、os.Fileとos.ReadDir関数の組み合わせでもできます。
以下のコード例に、filepath.Walk 関数を使用してディレクトリを走査する方法を示します:
package main
import (
"fmt"
"os"
"path/filepath"
)
func visitFile(path string, info os.DirEntry, err error) error {
if err != nil {
fmt.Printf("Error accessing path %q: %v\n", path, err)
return err
}
if info.IsDir() {
fmt.Printf("Directory: %s\n", path)
} else {
fmt.Printf("File: %s\n", path)
}
return nil
}
func main() {
root := "path/to/folder"
err := filepath.WalkDir(root, visitFile)
if err != nil {
fmt.Printf("Error walking path %q: %v\n", root, err)
}
}
例のfilepath.WalkDir関数は指定されたフォルダとそのサブフォルダを再帰的に走査し、visitFile関数を各ファイルないしフォルダに対して実行します。
visitFile 関数は、現在走査中のファイルまたはフォルダのパス、os.DirEntry オブジェクト、および可能性のあるエラーを受け取ります。
visitFile 関数内でファイルやフォルダに対して独自的操作を行うことができます。
Go 1.16以前のバージョンを使用している場合は、filepath.WalkDir関数の代わりに次のコードを使用できます:
package main
import (
"fmt"
"os"
"path/filepath"
)
func main() {
root := "path/to/folder"
err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
if err != nil {
fmt.Printf("Error accessing path %q: %v\n", path, err)
return err
}
if info.IsDir() {
fmt.Printf("Directory: %s\n", path)
} else {
fmt.Printf("File: %s\n", path)
}
return nil
})
if err != nil {
fmt.Printf("Error walking path %q: %v\n", root, err)
}
}
ファイルを再帰的に参照するfilepath.Walk関数は指定されたディレクトリとそのサブディレクトリを繰り返し処理し、匿名関数をそれぞれのファイル、またはディレクトリに適用します。
匿名関数は、現在処理しているファイルまたはフォルダのパス、ファイル情報オブジェクト、および可能性のあるエラーを受け取ります。
ファイルやフォルダに対して匿名関数内で独自の操作を実行できます。