概要
以下、自分用のメモです。
たまに使いたいときによく忘れているので、ここにメモメモ。。。
fs.FileInfo
が起点で、そこから fs.FileMode
を取得して判定します。
パーミッションの指定は unix ライクに 0400 とか 0644 のように指定して判定。
サンプル
package main import ( "fmt" "io/fs" "os" ) func tmpfile(perm fs.FileMode) (*os.File, fs.FileInfo, error) { f, err := os.CreateTemp(os.TempDir(), "") if err != nil { return nil, nil, err } if err := f.Chmod(perm); err != nil { return nil, nil, err } fi, err := f.Stat() if err != nil { return nil, nil, err } return f, fi, nil } func judge(perm fs.FileMode) (bool, bool, bool) { var ( r = perm&0400 == 0400 w = perm&0200 == 0200 x = perm&0100 == 0100 ) return r, w, x } func main() { // r-- { f, fi, err := tmpfile(0400) if err != nil { panic(err) } defer f.Close() r, w, x := judge(fi.Mode().Perm()) fmt.Printf("[0400] r=%v\tw=%v\tx=%v\n", r, w, x) } // -w- { f, fi, err := tmpfile(0200) if err != nil { panic(err) } defer f.Close() r, w, x := judge(fi.Mode().Perm()) fmt.Printf("[0200] r=%v\tw=%v\tx=%v\n", r, w, x) } // --x { f, fi, err := tmpfile(0100) if err != nil { panic(err) } defer f.Close() r, w, x := judge(fi.Mode().Perm()) fmt.Printf("[0100] r=%v\tw=%v\tx=%v\n", r, w, x) } // rwx { f, fi, err := tmpfile(0700) if err != nil { panic(err) } defer f.Close() r, w, x := judge(fi.Mode().Perm()) fmt.Printf("[0700] r=%v\tw=%v\tx=%v\n", r, w, x) } }
実行すると以下のようになります。
$ go run main.go [0400] r=true w=false x=false [0200] r=false w=true x=false [0100] r=false w=false x=true [0700] r=true w=true x=true
参考情報
https://pkg.go.dev/io/fs@go1.19.3#FileMode.Perm
https://pkg.go.dev/io/fs@go1.19.3#FileMode
過去の記事については、以下のページからご参照下さい。
サンプルコードは、以下の場所で公開しています。