Тип os.File

Тип os.File представляет собой файловый дескриптор для открытого файла. Он используется для выполнения всех операций ввода-вывода с файлами: чтения, записи, позиционирования, синхронизации и получения информации о файле. Объект типа os.File возвращается такими функциями, как os.Open, os.Create, os.OpenFile. После завершения работы с файлом его необходимо закрывать с помощью метода Close, чтобы освободить системные ресурсы.

Создание файла и запись данных

Для создания файла используется функция os.Create, которая возвращает указатель на тип os.File. Давайте создадим файл и запишем в него строку:

gopackage main

import (
  "fmt"
  "os"
)

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

  n, err := file.WriteString("Hello, World!")
  if err != nil {
    fmt.Println("Error writing to file:", err)
    return
  }

  fmt.Printf("Written %d bytes to file\n", n)
}

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

go"Written 13 bytes to file"

Чтение данных из файла

Для чтения данных из файла используется метод Read, который считывает данные в байтовый слайс. Давайте откроем существующий файл и прочитаем его содержимое:

gopackage main

import (
  "fmt"
  "os"
)

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

  buffer := make([]byte, 1024)
  n, err := file.Read(buffer)
  if err != nil {
    fmt.Println("Error reading from file:", err)
    return
  }

  fmt.Printf("Read %d bytes: %s\n", n, string(buffer[:n]))
}

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

go"Read 13 bytes: Hello, World!"

Получение информации о файле

Метод Stat возвращает информацию о файле, включая его размер, права доступа и время модификации. Давайте получим информацию о файле:

gopackage main

import (
  "fmt"
  "os"
)

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

  info, err := file.Stat()
  if err != nil {
    fmt.Println("Error getting file info:", err)
    return
  }

  fmt.Printf("File name: %s\n", info.Name())
  fmt.Printf("File size: %d bytes\n", info.Size())
  fmt.Printf("Is directory: %t\n", info.IsDir())
  fmt.Printf("Permissions: %s\n", info.Mode())
}

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

go"File name: example.txt"
"File size: 13 bytes"
"Is directory: false"
"Permissions: -rw-r--r--"

Позиционирование в файле

Метод Seek позволяет перемещать текущую позицию в файле. Это полезно для чтения и записи с определенного места. Давайте прочитаем данные начиная с пятого символа:

gopackage main

import (
  "fmt"
  "os"
)

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

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

  buffer := make([]byte, 1024)
  n, err := file.Read(buffer)
  if err != nil {
    fmt.Println("Error reading from file:", err)
    return
  }

  fmt.Printf("Read from position 5: %s\n", string(buffer[:n]))
}

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

go"Read from position 5: , World!"

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

  • функцию os.Open,
    которая открывает файл только для чтения
  • функцию os.Create,
    которая создает файл для записи
  • метод os.File.Close,
    который закрывает файловый дескриптор
  • метод os.File.Stat,
    который получает информацию о файле