Ce face os.IsNotExist
os.IsNotExist(err) returnează true pentru erorile de tip „no such file or directory”, de exemplu de la os.Stat sau os.Open. os.IsExist(err) returnează true pentru „file exists”, de exemplu de la os.Mkdir sau os.OpenFile cu O_EXCL.
Ambele funcții sunt mai vechi decât împachetarea erorilor (%w) și nu se uită în interiorul unei erori împachetate. În cod nou, preferă errors.Is(err, fs.ErrNotExist) și errors.Is(err, fs.ErrExist), care funcționează în ambele situații.
Parametri
| Parametru | Descriere |
|---|---|
err |
Eroarea de verificat; nil dă false. |
Ce returnează
true sau false.
Exemple
Exemplul 1: Verificarea existenței unui fișier
package main
import (
"fmt"
"os"
)
func exista(nume string) bool {
_, err := os.Stat(nume)
return !os.IsNotExist(err)
}
func main() {
os.WriteFile("factura.pdf", []byte("..."), 0o644)
fmt.Println("factura.pdf:", exista("factura.pdf"))
fmt.Println("chitanta.pdf:", exista("chitanta.pdf"))
}
Rezultat
factura.pdf: true
chitanta.pdf: false
Exemplul 2: IsExist la crearea exclusivă
O_EXCL cere ca fișierul să fie nou; a doua încercare dă „file exists”.
package main
import (
"fmt"
"os"
)
func main() {
for i := 1; i <= 2; i++ {
f, err := os.OpenFile("blocare.lock", os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0o644)
if os.IsExist(err) {
fmt.Println("încercarea", i, ": alt proces lucrează deja")
continue
}
fmt.Println("încercarea", i, ": am obținut blocarea")
f.Close()
}
}
Rezultat
încercarea 1 : am obținut blocarea
încercarea 2 : alt proces lucrează deja
Exemplul 3: Eroare împachetată: IsNotExist nu o vede
package main
import (
"errors"
"fmt"
"io/fs"
"os"
)
func citesteSetari() error {
_, err := os.ReadFile("setari.toml")
if err != nil {
return fmt.Errorf("citire setări: %w", err)
}
return nil
}
func main() {
err := citesteSetari()
fmt.Println(err)
fmt.Println("os.IsNotExist:", os.IsNotExist(err))
fmt.Println("errors.Is:", errors.Is(err, fs.ErrNotExist))
}
Rezultat
citire setări: open setari.toml: no such file or directory
os.IsNotExist: false
errors.Is: true
Greșeli frecvente
- Scrii
if !os.IsNotExist(err)și presupui că fișierul există. Și alte erori (lipsă drepturi) daufalse; verifică întâierr == nil. - Folosești
os.IsNotExistpe o eroare împachetată cu%w. Rezultatul estefalse; foloseșteerrors.Is. - Verifici existența cu
Statși apoi creezi fișierul. Între cele două alt proces îl poate crea; pentru creare sigură foloseșteO_EXCL.
Comenzi înrudite
os.IsPermission: Spune dacă o eroare a apărut din lipsa drepturilor de acces (permission denied).os.IsTimeout: Spune dacă o eroare înseamnă că a expirat timpul de așteptare (timeout) al unei operații.os.Mkdir: Creează un singur director nou; dă eroare dacă există deja sau dacă directorul părinte lipsește.os.ReadFile: Citește tot conținutul unui fișier într-un slice de octeți, dintr-un singur apel.os.Stat: Returnează informațiile unui fișier (dimensiune, drepturi, dată, director sau nu) fără să-l deschidă; Lstat nu urmează legăturile.