いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-187 (os.Mkdir() などで指定するパーミッションについて)(os.ModePerm, 0777)

概要

以下は自分用のメモです。よく忘れるので、ここにメモメモ。。

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) を指定しても、結果は同じになります。

参考情報

stackoverflow.com

stackoverflow.com


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。