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ă.