os.IsNotExist în Go

IsNotExist spune dacă o eroare înseamnă „fișierul nu există”; IsExist, dacă înseamnă „există deja”.

Sintaxă
func IsNotExist(err error) bool
func IsExist(err error) bool

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) dau false; verifică întâi err == nil.
  • Folosești os.IsNotExist pe o eroare împachetată cu %w. Rezultatul este false; folosește errors.Is.
  • Verifici existența cu Stat și apoi creezi fișierul. Între cele două alt proces îl poate crea; pentru creare sigură folosește O_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.