Метод os.File.Seek

Метод os.File.Seek позволяет перемещать указатель текущей позиции в файле. Он принимает два параметра: первый — смещение в байтах (тип int64), второй — исходная точка отсчета (тип int), которая определяет, откуда производится смещение. Метод возвращает новую позицию указателя и ошибку, если операция не удалась.

Синтаксис

gopos, err := file.Seek(offset, whence)

Параметр whence может принимать следующие константы из пакета io:

Пример "Seek от начала файла"

Давайте откроем файл и установим позицию на 10-й байт от начала:

gopackage main

import (
  "fmt"
  "io"
  "os"
)

func main() {
  file, err := os.Open("example.txt")
  if err != nil {
    fmt.Println("Error opening file:", err)
    return
  }
  defer file.Close()

  pos, err := file.Seek(10, io.SeekStart)
  if err != nil {
    fmt.Println("Seek error:", err)
    return
  }

  fmt.Println("New position:", pos)
}

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

go"New position: 10"

Пример "Seek от текущей позиции"

Сместим указатель на 5 байт вперед относительно текущей позиции. Для этого сначала считаем несколько байт, чтобы изменить текущую позицию:

gopackage main

import (
  "fmt"
  "io"
  "os"
)

func main() {
  file, err := os.Open("example.txt")
  if err != nil {
    fmt.Println("Error opening file:", err)
    return
  }
  defer file.Close()

  // Read 5 bytes to move cursor
  buf := make([]byte, 5)
  _, err = file.Read(buf)
  if err != nil {
    fmt.Println("Read error:", err)
    return
  }

  pos, err := file.Seek(5, io.SeekCurrent)
  if err != nil {
    fmt.Println("Seek error:", err)
    return
  }

  fmt.Println("New position after Seek:", pos)
}

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

go"New position after Seek: 10"

Пример "Seek от конца файла"

Переместим указатель на 5 байт назад от конца файла. Это полезно для чтения последних байтов файла:

gopackage main

import (
  "fmt"
  "io"
  "os"
)

func main() {
  file, err := os.Open("example.txt")
  if err != nil {
    fmt.Println("Error opening file:", err)
    return
  }
  defer file.Close()

  pos, err := file.Seek(-5, io.SeekEnd)
  if err != nil {
    fmt.Println("Seek error:", err)
    return
  }

  fmt.Println("Position from end:", pos)
}

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

go"Position from end: 15"

Пример "Получение текущей позиции"

Чтобы узнать текущую позицию указателя без изменения, можно использовать Seek с нулевым смещением и параметром io.SeekCurrent:

gopackage main

import (
  "fmt"
  "io"
  "os"
)

func main() {
  file, err := os.Open("example.txt")
  if err != nil {
    fmt.Println("Error opening file:", err)
    return
  }
  defer file.Close()

  pos, err := file.Seek(0, io.SeekCurrent)
  if err != nil {
    fmt.Println("Seek error:", err)
    return
  }

  fmt.Println("Current position:", pos)
}

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

go"Current position: 0"

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

  • метод os.File.Read,
    который читает данные из файла с текущей позиции
  • метод os.File.Write,
    который записывает данные в файл с текущей позиции
  • интерфейс io.Seeker,
    который реализует метод Seek
  • метод os.File.Stat,
    который возвращает информацию о файле, включая его размер