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)
|
在建立暫存目錄時,最好遞延移除動作。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")
|
ReadDir 會列出目錄的內容,回傳一個 os.DirEntry 物件切片。
|
c, err := os.ReadDir("subdir/parent")
check(err)
|
|
fmt.Println("Listing subdir/parent")
for _, entry := range c {
fmt.Println(" ", entry.Name(), entry.IsDir())
}
|
Chdir 能讓我們變更目前的工作目錄,類似於 cd 。
|
err = os.Chdir("subdir/parent/child")
check(err)
|
現在我們列出目前目錄時,將會看到 subdir/parent/child 的內容。
|
c, err = os.ReadDir(".")
check(err)
|
|
fmt.Println("Listing subdir/parent/child")
for _, entry := range c {
fmt.Println(" ", entry.Name(), entry.IsDir())
}
|
cd 回到我們開始的地方。
|
err = os.Chdir("../../..")
check(err)
|
我們也可以遞迴地巡訪一個目錄,包括其所有子目錄。WalkDir 接受一個回呼函式,用於處理巡訪到的每個檔案或目錄。
|
fmt.Println("Visiting subdir")
err = filepath.WalkDir("subdir", visit)
}
|
visit 會被 filepath.WalkDir 遞迴找到的每個檔案或目錄呼叫。
|
func visit(path string, d fs.DirEntry, err error) error {
if err != nil {
return err
}
fmt.Println(" ", path, d.IsDir())
return nil
}
|