こんにちは、kurumi-bioです。
目次
環境
初めに
osパッケージのChmod関数は、二つ目の引数にファイルのパーミッションを渡す仕様になっている。 固定値の場合は8進数の数値を記載することが可能だが、変数で渡すときにフォーマットがわからなかったため、 プログラムを作成して調査することにした。
os.Chmodの説明は下記を参照してください。 kurumi-bio.hatenablog.com
数値とパーミッション(権限)の関係
◆テストコード
package main import ( "fmt" "os" ) // 引数で指定したファイルのモードを引数で指定したモードに変更する func cm(filePath string, mode int) { e := os.Chmod(filePath, os.FileMode(mode)) if e != nil { fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("os.Chmod", e)) return } fmt.Printf("[%02d][%03o]", mode, mode) } // 引数で指定したファイルのモードを出力する func pm(fileName string) { fi, e := os.Stat(fileName) if e != nil { fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("os.Stat", e)) return } fmt.Printf("[%v]\n", fi.Mode().Perm()) } func main() { const fileName = "test.txt" for i := 0; i < 20; i = i + 1 { cm(fileName, i) pm(fileName) } }
◆実行結果(Linux)
8進数文字列でパーミッション(権限)を指定
◆テストコード
package main import ( "fmt" "os" "strconv" ) // 引数で指定したファイルのモードを引数で指定したモードに変更する func cm(filePath string, mode string) { i, _ := strconv.ParseInt(mode, 8, 32) e := os.Chmod(filePath, os.FileMode(i)) if e != nil { fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("os.Chmod", e)) return } fmt.Printf("[%s][%03d]", mode, i) } // 引数で指定したファイルのモードを出力する func pm(fileName string) { fi, e := os.Stat(fileName) if e != nil { fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("os.Stat", e)) return } fmt.Printf("[%v]\n", fi.Mode().Perm()) } func main() { const fileName = "test.txt" cm(fileName, "0777") pm(fileName) cm(fileName, "0700") pm(fileName) cm(fileName, "0060") pm(fileName) }
◆実行結果(Linux)
最後までご覧いただきありがとうございます