kurumi-bioの雑記帳

プログラミング、パソコン、ペット、 犬、お出かけ

初心者のGo言語 -27- os.Chmodを調べる

こんにちは、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)
    }
}

コードの説明 os.Chmod()関数を使って"test.txt"のパーミッション(権限)を変更し、os.Stat関数を使って結果を出力します。 パーミッション(権限)に0~20までの整数を指定し、どのような値になるかを確認します。 実行時の出力は、下記の通りです。

  • 1ブロック目:os.Chmodos.FileModeに渡している数値です。
  • 2ブロック目:os.FileModeに渡している数値を8進数に変換した数値です。
  • 3ブロック目:os.Statで取得したパーミッション(権限)を出力しています。

◆実行結果(Linux)

実行結果の説明 2ブロック目の8進数の値が、Linuxのchmodコマンドの数値で指定した値と同じになっています。 ですので、数値指定の8進数を10進数に変換してos.Chmodに渡せば、 chmodコマンドと同じフォーマットでパーミッション(権限)の変更が可能になります。

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)
}

コードの説明 文字列で記述されたパーミッション(権限)をstrconv.ParseInt関数を使って8進数文字列を整数(10進数)に変換してから、 os.Chmodに渡しています。

  • 1ブロック目:パーミッション(権限)に指定した8進数の文字列です。
  • 2ブロック目:整数(10進数)に変換後の値です。
  • 3ブロック目:os.Statで取得したパーミッション(権限)を出力しています。

◆実行結果(Linux)

実行結果の説明 Linuxのchmodコマンドに渡すフォーマットと同じ記載でパーミッション(権限)が変更できました。

最後までご覧いただきありがとうございます