Константа os.O_EXCL

Константа os.O_EXCL используется при открытии файла вместе с флагом os.O_CREATE. Она гарантирует, что файл будет создан только в том случае, если он не существует. Если файл с указанным именем уже присутствует в системе, вызов вернет ошибку. Это особенно полезно для предотвращения случайной перезаписи существующих файлов, когда требуется создать новый уникальный файл.

Синтаксис

goos.OpenFile(name, os.O_CREATE|os.O_EXCL|os.O_WRONLY, perm)

Пример

Попробуем создать новый файл, которого еще не существует:

gopackage main

import (
  "fmt"
  "os"
)

func main() {
  file, err := os.OpenFile("newfile.txt", os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0644)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }
  defer file.Close()

  file.WriteString("Hello, World!")
  fmt.Println("File created successfully")
}

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

go"File created successfully"

Пример

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

gopackage main

import (
  "fmt"
  "os"
)

func main() {
  // Сначала создадим файл
  file1, err := os.Create("existing.txt")
  if err != nil {
    fmt.Println("Error creating file:", err)
    return
  }
  file1.Close()

  // Теперь попытаемся создать его снова с флагом O_EXCL
  file2, err := os.OpenFile("existing.txt", os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0644)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }
  defer file2.Close()

  fmt.Println("File created successfully")
}

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

go"Error: open existing.txt: file exists"

Пример

Используем os.O_EXCL для атомарного создания файла при записи данных. Если файл уже существует, мы не перезаписываем его и выводим соответствующее сообщение:

gopackage main

import (
  "fmt"
  "os"
)

func main() {
  filename := "data.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, skipping creation")
    } else {
      fmt.Println("Error:", err)
    }
    return
  }
  defer file.Close()

  file.WriteString("Important data")
  fmt.Println("File created and data written")
}

Результат выполнения кода (при наличии файла):

go"File already exists, skipping creation"

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

  • константу os.O_CREATE,
    которая указывает на необходимость создания файла
  • константу os.O_TRUNC,
    которая очищает содержимое файла при открытии
  • константу os.O_APPEND,
    которая добавляет данные в конец файла
  • функцию os.OpenFile,
    которая открывает файл с указанными флагами и правами доступа