Go には、ファイル システム内のディレクトリ操作用の便利な関数が数多くあります。
|
|
|

package main
|
|
import (
"fmt"
"io/fs"
"os"
"path/filepath"
)
|
|
func check(e error) {
if e != nil {
panic(e)
}
}
|
|
func main() {
|
現在の作業ディレクトリに新しいサブディレクトリを作成します。
|
err := os.Mkdir("subdir", 0755)
check(err)
|
一時ディレクトリを作成するときは、削除を `defer` するのが適切な方法です。`os.RemoveAll` は、ディレクトリ ツリー全体を削除します(`rm -rf` と同様)。
|
defer os.RemoveAll("subdir")
|
新しい空ファイルを作成するヘルパー関数。
|
createEmptyFile := func(name string) {
d := []byte("")
check(os.WriteFile(name, d, 0644))
}
|
|
createEmptyFile("subdir/file1")
|
親ディレクトリを含むディレクトリの階層は、`MkdirAll` で作成できます。コマンドラインの `mkdir -p` と似ています。
|
err = os.MkdirAll("subdir/parent/child", 0755)
check(err)
|
|
createEmptyFile("subdir/parent/file2")
createEmptyFile("subdir/parent/file3")
createEmptyFile("subdir/parent/child/file4")
|
現在のディレクトリをリストすると、`subdir/parent/child` の内容が表示されます。
|
c, err := os.ReadDir("subdir/parent")
check(err)
|
|
fmt.Println("Listing subdir/parent")
for _, entry := range c {
fmt.Println(" ", entry.Name(), entry.IsDir())
}
|
ディレクトリのリストには `ReadDir` を使用すると、スライスの `os.DirEntry` オブジェクトが返されます。
|
err = os.Chdir("subdir/parent/child")
check(err)
|
`Chdir` を使用すると、`cd` と同様に、現在の作業ディレクトリを変更できます。
|
c, err = os.ReadDir(".")
check(err)
|
|
fmt.Println("Listing subdir/parent/child")
for _, entry := range c {
fmt.Println(" ", entry.Name(), entry.IsDir())
}
|
現在のディレクトリをリストすると、`subdir/parent/child` の内容が表示されます。
|
err = os.Chdir("../../..")
check(err)
|
開始した場所に戻ります。
|
fmt.Println("Visiting subdir")
err = filepath.WalkDir("subdir", visit)
}
|
すべてのサブディレクトリを含むディレクトリを再帰的に訪問することもできます。`WalkDir` は、訪問した各ファイルまたはディレクトリの処理用のコールバック関数を受け入れます。
|
func visit(path string, d fs.DirEntry, err error) error {
if err != nil {
return err
}
fmt.Println(" ", path, d.IsDir())
return nil
}
|