概要
以下は自分用のメモです。よく忘れるので、ここにメモメモ。。
Goで、ディレクトリを作成したりする際に os.Mkdir()
とか os.MkdirAll()
を使うと思いますが
この関数には、引数でパーミッションを渡すことになります。
で、通常は 0755 とかを渡したりしているサンプルが多いと思いますが、基本は os.ModePerm
を渡しておけばいいです。
os.ModePerm
の値は 0777
なのですが、デフォルトのパーミッションは umask で制御されるべきです。
なので、仕様上で決まった制限が必要で無い限り、常に os.ModePerm
で良いくらいの感覚で個人的には良いかと思ってます。
サンプル
package osop import ( "os" "os/exec" "path/filepath" "github.com/devlights/gomy/output" ) // Mkdir -- os.Mkdir/MkdirAllのサンプルです. // // REFERENCES: // - https://pkg.go.dev/os@go1.17.8 // - https://stackoverflow.com/questions/14249467/os-mkdir-and-os-mkdirall-permissions // - https://stackoverflow.com/questions/33450980/how-to-remove-all-contents-of-a-directory-using-golang func Mkdir() error { // // ディレクトリ作成時などにパーミッションを指定する必要があるが // ここには8進数のパーミッション値を直接指定することができる. // // ex: 0755 // // でも、基本、os.ModePerm (0777) を指定しておけば良い。 // そのシステムにおけるデフォルトのパーミッションは umask で制御されるべきであるため。 // var ( tmpDir = os.TempDir() baseDir = filepath.Join(tmpDir, "try-golang", "osop") p1 = filepath.Join(baseDir, "d1") p2 = filepath.Join(baseDir, "d2") ) err := os.RemoveAll(baseDir) if err != nil { return err } // 8進数指定 err = os.MkdirAll(p1, 0755) if err != nil { return err } // os.ModePerm (0777) を指定 err = os.MkdirAll(p2, os.ModePerm) if err != nil { return err } // 結果確認 b, err := exec.Command("ls", "-l", baseDir).Output() if err != nil { return err } output.Stdoutf("[ls -l]", "%s\n", b) return nil }
実行すると以下の様になります。
gitpod /workspace/try-golang (master) $ umask 0022 gitpod /workspace/try-golang (master) $ make run go run github.com/devlights/try-golang/cmd/trygolang -onetime -example "" ENTER EXAMPLE NAME: osop_mkdir [Name] "osop_mkdir" [ls -l] total 0 drwxr-xr-x 2 gitpod gitpod 40 Mar 22 08:27 d1 drwxr-xr-x 2 gitpod gitpod 40 Mar 22 08:27 d2 [Elapsed] 2.188601ms
上は gitpod 上で実行していますが、umask の値を見ると 0022 と出ます。なので、デフォルトのディレクトリのパーミッションは 0755 となります。
なので、明示的に 0755 と指定しても、os.ModePerm
(0777) を指定しても、結果は同じになります。
参考情報
過去の記事については、以下のページからご参照下さい。
サンプルコードは、以下の場所で公開しています。