Ошибка os.ErrExist
Ошибка os.ErrExist возвращается функциями пакета os,
когда операция требует создания нового файла или директории,
но по указанному пути уже существует файл или директория.
Эта ошибка часто возникает при использовании функций
os.Mkdir, os.Create или os.OpenFile
с флагом os.O_CREATE и os.O_EXCL.
Ошибка os.ErrExist является предопределенной переменной
в пакете os. Ее можно сравнивать с возвращаемой ошибкой
с помощью оператора сравнения или использовать функцию
errors.Is для надежной проверки в цепочке ошибок.
Синтаксис
var ErrExist = errors.New("file already exists")
Обычно эта ошибка возвращается как часть *os.PathError,
который содержит дополнительную информацию о пути и операции.
Пример
Давайте попробуем создать директорию, которая уже существует:
package main
import (
"fmt"
"os"
)
func main() {
dirName := "test_dir"
err := os.Mkdir(dirName, 0755)
if err != nil {
if os.IsExist(err) {
fmt.Println("Directory already exists")
} else {
fmt.Printf("Error creating directory: %v\n", err)
}
} else {
fmt.Println("Directory created successfully")
}
}
Если директория уже существует, результатом будет:
"Directory already exists"
Пример
Давайте попробуем создать файл с флагом os.O_EXCL,
который гарантирует, что файл не существует:
package main
import (
"fmt"
"os"
)
func main() {
fileName := "test.txt"
file, err := os.OpenFile(fileName, os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0644)
if err != nil {
if os.IsExist(err) {
fmt.Println("File already exists")
} else {
fmt.Printf("Error opening file: %v\n", err)
}
return
}
defer file.Close()
_, err = file.WriteString("Hello, World!")
if err != nil {
fmt.Printf("Error writing to file: %v\n", err)
return
}
fmt.Println("File created and written successfully")
}
Если файл уже существует, результатом будет:
"File already exists"
Пример
Давайте проверим ошибку с помощью errors.Is
для более надежной проверки:
package main
import (
"errors"
"fmt"
"os"
)
func main() {
dirName := "existing_dir"
err := os.Mkdir(dirName, 0755)
if err != nil {
if errors.Is(err, os.ErrExist) {
fmt.Println("Directory already exists (using errors.Is)")
} else {
fmt.Printf("Error creating directory: %v\n", err)
}
} else {
fmt.Println("Directory created successfully")
}
}
Результат выполнения кода:
"Directory already exists (using errors.Is)"
Смотрите также
-
функцию
os.IsExist,
которая проверяет, является ли ошибка ошибкой существования -
функцию
os.Mkdir,
которая создает директорию и может вернутьos.ErrExist -
функцию
os.MkdirAll,
которая создает все директории в пути и игнорирует ошибку существования -
функцию
os.OpenFile,
которая открывает файл и может вернутьos.ErrExistс флагомos.O_EXCL