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

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

Синтаксис

goos.O_APPEND

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

В следующем примере мы открываем файл для дозаписи. Если файл не существует, он будет создан (благодаря флагу os.O_CREATE). Затем мы записываем в него две строки.

gopackage main

import (
  "fmt"
  "os"
)

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

  _, err = file.WriteString("Первая запись\n")
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  _, err = file.WriteString("Вторая запись\n")
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  fmt.Println("Данные успешно добавлены в файл")
}

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

go"Данные успешно добавлены в файл"

Пример дозаписи в существующий файл

Предположим, что у нас уже есть файл с содержимым "Hello, World!". Откроем его с флагом os.O_APPEND и добавим еще одну строку.

gopackage main

import (
  "fmt"
  "os"
)

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

  _, err = file.WriteString("Добавленная строка\n")
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  fmt.Println("Строка добавлена в конец файла")
}

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

go"Строка добавлена в конец файла"

Пример: попытка записи в начало файла с os.O_APPEND

Даже если мы попытаемся переместить указатель файла в начало с помощью file.Seek, запись все равно произойдет в конец файла, благодаря флагу os.O_APPEND. Это демонстрирует, что флаг имеет приоритет над позицией указателя.

gopackage main

import (
  "fmt"
  "os"
)

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

  // Перемещаем указатель в начало файла
  _, err = file.Seek(0, 0)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  // Запись все равно произойдет в конец
  _, err = file.WriteString("Эта строка будет в конце\n")
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  fmt.Println("Запись выполнена в конец файла")
}

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

go"Запись выполнена в конец файла"

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

  • константу os.O_CREATE,
    которая создает файл, если он не существует
  • константу os.O_RDWR,
    которая открывает файл для чтения и записи
  • функцию os.OpenFile,
    которая открывает файл с указанными флагами
  • метод os.File.WriteString,
    который записывает строку в файл