いろいろ備忘録日記

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

Goメモ-274 (ファイルが読み込み・書き込み・実行可能かどうかを判定)

概要

以下、自分用のメモです。

たまに使いたいときによく忘れているので、ここにメモメモ。。。

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

Go言語による並行処理

Go言語による並行処理

Amazon


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

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