os.IsPermission în Go

Spune dacă o eroare a apărut din lipsa drepturilor de acces (permission denied).

Sintaxă
func IsPermission(err error) bool

Ce face os.IsPermission

os.IsPermission returnează true pentru erorile „permission denied” și „operation not permitted”, de exemplu când deschizi pentru scriere un fișier doar pentru citire sau un fișier al altui utilizator.

Ca la os.IsNotExist, funcția nu desface erorile împachetate. În cod nou preferă errors.Is(err, fs.ErrPermission).

Parametri

Parametru Descriere
err Eroarea de verificat.

Ce returnează

true dacă eroarea este de drepturi, altfel false.

Exemple

Exemplul 1: Fișier fără drepturi de citire

Rezultatul presupune că programul nu rulează ca root (root poate citi orice).

package main

import (
    "fmt"
    "os"
)

func main() {
    os.WriteFile("salarii.csv", []byte("Ana,7500\n"), 0o644)
    os.Chmod("salarii.csv", 0o000)

    _, err := os.ReadFile("salarii.csv")
    fmt.Println("eroare:", err)
    fmt.Println("lipsă drepturi:", os.IsPermission(err))
}

Rezultat

eroare: open salarii.csv: permission denied
lipsă drepturi: true

Exemplul 2: Mesaj prietenos după tipul erorii

package main

import (
    "errors"
    "fmt"
    "io/fs"
    "os"
)

func explica(err error) string {
    switch {
    case err == nil:
        return "totul e în regulă"
    case errors.Is(err, fs.ErrNotExist):
        return "fișierul nu există"
    case errors.Is(err, fs.ErrPermission):
        return "nu ai drepturi asupra fișierului"
    default:
        return "altă eroare: " + err.Error()
    }
}

func main() {
    os.WriteFile("deschis.txt", nil, 0o644)
    os.WriteFile("blocat.txt", nil, 0o644)
    os.Chmod("blocat.txt", 0o000)

    for _, nume := range []string{"deschis.txt", "blocat.txt", "lipsa.txt"} {
        _, err := os.ReadFile(nume)
        fmt.Printf("%-12s %s\n", nume, explica(err))
    }
}

Rezultat

deschis.txt  totul e în regulă
blocat.txt   nu ai drepturi asupra fișierului
lipsa.txt    fișierul nu există

Greșeli frecvente

  • Testezi programul ca root (sau în Docker ca root) și nu vezi niciodată eroarea de drepturi, care apare apoi la utilizatori.

Comenzi înrudite

  • os.IsNotExist: IsNotExist spune dacă o eroare înseamnă „fișierul nu există”; IsExist, dacă înseamnă „există deja”.
  • os.Chmod: Schimbă drepturile de acces (citire, scriere, execuție) ale unui fișier sau director.
  • os.Chown: Schimbă proprietarul și grupul unui fișier; Lchown face același lucru pentru o legătură simbolică.