РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
610 of 1593 menu

Ошибка fs.ErrExist

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

Синтаксис

err := error // ошибка, возвращаемая функциями fs if errors.Is(err, fs.ErrExist) { // обработка ситуации, когда файл уже существует }

Ошибка fs.ErrExist является переменной уровня пакета и имеет тип error. Для проверки наличия этой ошибки следует использовать функцию errors.Is, которая корректно работает с обертками ошибок, в отличие от прямого сравнения через оператор ==.

Пример

Давайте попробуем создать файл, который уже существует, и обработаем ошибку:

package main import ( "errors" "fmt" "os" ) func main() { filename := "example.txt" // Создаем файл первый раз file, err := os.Create(filename) if err != nil { fmt.Println("Error creating file:", err) return } file.Close() // Пытаемся создать файл снова file, err = os.Create(filename) if err != nil { if errors.Is(err, fs.ErrExist) { fmt.Println("File already exists") } else { fmt.Println("Other error:", err) } return } defer file.Close() }

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

"File already exists"

Пример

Давайте рассмотрим проверку существования директории перед ее созданием:

package main import ( "errors" "fmt" "os" ) func main() { dirName := "testdir" // Пытаемся создать директорию err := os.Mkdir(dirName, 0755) if err != nil { if errors.Is(err, fs.ErrExist) { fmt.Println("Directory already exists") } else { fmt.Println("Other error:", err) } return } fmt.Println("Directory created successfully") // Пытаемся создать директорию повторно err = os.Mkdir(dirName, 0755) if err != nil { if errors.Is(err, fs.ErrExist) { fmt.Println("Directory already exists") } else { fmt.Println("Other error:", err) } } }

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

"Directory created successfully" "Directory already exists"

Пример

Давайте рассмотрим использование флага os.O_EXCL для атомарной проверки существования файла:

package main import ( "errors" "fmt" "os" ) func main() { filename := "exclusive.txt" // Пытаемся создать файл с флагом O_EXCL file, err := os.OpenFile( filename, os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0644, ) if err != nil { if errors.Is(err, fs.ErrExist) { fmt.Println("File already exists") } else { fmt.Println("Other error:", err) } return } defer file.Close() file.WriteString("This file was created exclusively") fmt.Println("File created successfully") }

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

"File created successfully"

При повторном запуске программы будет выведено сообщение о том, что файл уже существует.

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

  • ошибку os.ErrExist,
    которая является аналогом для работы с функциями пакета os
  • функцию os.IsExist,
    которая проверяет, является ли ошибка ошибкой существования
  • ошибку fs.ErrNotExist,
    которая указывает на отсутствие файла или директории
  • функцию os.Stat,
    которая проверяет существование файла без его открытия
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить