Метод os.File.Seek
Метод os.File.Seek позволяет перемещать указатель текущей позиции в файле.
Он принимает два параметра: первый — смещение в байтах (тип int64),
второй — исходная точка отсчета (тип int), которая определяет,
откуда производится смещение. Метод возвращает новую позицию указателя
и ошибку, если операция не удалась.
Синтаксис
pos, err := file.Seek(offset, whence)
Параметр whence может принимать следующие константы из пакета io:
-
io.SeekStart(значение 0) — смещение относительно начала файла -
io.SeekCurrent(значение 1) — смещение относительно текущей позиции -
io.SeekEnd(значение 2) — смещение относительно конца файла
Пример "Seek от начала файла"
Давайте откроем файл и установим позицию на 10-й байт от начала:
package 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)
}
Результат выполнения кода:
"New position: 10"
Пример "Seek от текущей позиции"
Сместим указатель на 5 байт вперед относительно текущей позиции. Для этого сначала считаем несколько байт, чтобы изменить текущую позицию:
package 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)
}
Результат выполнения кода:
"New position after Seek: 10"
Пример "Seek от конца файла"
Переместим указатель на 5 байт назад от конца файла. Это полезно для чтения последних байтов файла:
package 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)
}
Результат выполнения кода:
"Position from end: 15"
Пример "Получение текущей позиции"
Чтобы узнать текущую позицию указателя без изменения,
можно использовать Seek с нулевым смещением
и параметром io.SeekCurrent:
package 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)
}
Результат выполнения кода:
"Current position: 0"
Смотрите также
-
метод
os.File.Read,
который читает данные из файла с текущей позиции -
метод
os.File.Write,
который записывает данные в файл с текущей позиции -
интерфейс
io.Seeker,
который реализует методSeek -
метод
os.File.Stat,
который возвращает информацию о файле, включая его размер