Ошибка fs.ErrNotExist

Ошибка fs.ErrNotExist представляет собой стандартную ошибку, которая возвращается функциями пакета io/fs при попытке доступа к файлу или директории, которые не существуют в файловой системе. Эта ошибка используется для проверки наличия файлов и корректной обработки ситуаций, когда файл не найден.

Синтаксис

govar ErrNotExist = errors.New("file does not exist")

Пример проверки ошибки при открытии файла

Давайте попробуем открыть несуществующий файл и проверим, возвращает ли функция os.Open ошибку fs.ErrNotExist:

gopackage main

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

func main() {
  file, err := os.Open("nonexistent.txt")
  if err != nil {
    if err == fs.ErrNotExist {
      fmt.Println("file does not exist")
    } else {
      fmt.Println("other error:", err)
    }
    return
  }
  defer file.Close()
  fmt.Println("file opened successfully")
}

Результат выполнения кода:

go"file does not exist"

Пример с использованием os.IsNotExist

Более надежный способ проверки ошибки fs.ErrNotExist - использовать функцию os.IsNotExist, которая корректно работает с обернутыми ошибками:

gopackage main

import (
  "fmt"
  "os"
)

func main() {
  _, err := os.Stat("missing_file.txt")
  if err != nil {
    if os.IsNotExist(err) {
      fmt.Println("file or directory does not exist")
    } else {
      fmt.Println("other error:", err)
    }
    return
  }
  fmt.Println("file exists")
}

Результат выполнения кода:

go"file or directory does not exist"

Пример сравнения с fs.ErrNotExist

При работе с функциями пакета os ошибка может быть обернута в fs.PathError, поэтому прямое сравнение с fs.ErrNotExist может не сработать. Рассмотрим этот случай:

gopackage main

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

func main() {
  _, err := os.Open("no_such_file.txt")
  if err != nil {
    if errors.Is(err, fs.ErrNotExist) {
      fmt.Println("file does not exist (using errors.Is)")
    }
    
    if err == fs.ErrNotExist {
      fmt.Println("file does not exist (direct comparison)")
    } else {
      fmt.Println("direct comparison failed")
    }
  }
}

Результат выполнения кода:

go"file does not exist (using errors.Is)"
"direct comparison failed"

Смотрите также

  • функцию os.IsNotExist,
    которая проверяет, указывает ли ошибка на отсутствие файла
  • функцию os.IsExist,
    которая проверяет, указывает ли ошибка на существование файла
  • функцию os.Stat,
    которая возвращает информацию о файле или директории
  • функцию os.IsPermission,
    которая проверяет наличие ошибки доступа к файлу