Как в Go получить имя и другую информацию о файле по его пути?

Ответ

В Go существует два основных подхода для работы с именами файлов, которые служат разным целям.

1. Получение информации из файловой системы (os.Stat)

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

  • Функция: os.Stat(path string) (os.FileInfo, error)
  • Результат: Возвращает структуру os.FileInfo, которая содержит всю информацию о файле.
import (
    "fmt"
    "log"
    "os"
)

func main() {
    filePath := "./my_document.txt"
    fileInfo, err := os.Stat(filePath)
    if err != nil {
        if os.IsNotExist(err) {
            log.Fatalf("Файл не существует: %s", filePath)
        }
        log.Fatal(err)
    }

    fmt.Printf("Имя файла: %sn", fileInfo.Name())       // my_document.txt
    fmt.Printf("Размер: %d байтn", fileInfo.Size())     // 12345
    fmt.Printf("Это директория: %tn", fileInfo.IsDir()) // false
    fmt.Printf("Права доступа: %sn", fileInfo.Mode())   // -rw-r--r--
    fmt.Printf("Время изменения: %sn", fileInfo.ModTime())
}

2. Работа со строкой пути (path/filepath)

Этот способ используется для манипуляции строками, представляющими пути. Он не обращается к файловой системе и не проверяет, существует ли файл. Это быстрый и безопасный способ разобрать путь на части.

  • Пакет: path/filepath (рекомендуется для кросс-платформенной совместимости).
  • Основные функции:
    • filepath.Base(path): возвращает последнюю часть пути (имя файла с расширением).
    • filepath.Dir(path): возвращает путь к директории, в которой находится файл.
    • filepath.Ext(path): возвращает расширение файла.
import (
    "fmt"
    "path/filepath"
)

func main() {
    fullPath := "/home/user/documents/report.docx"

    fileName := filepath.Base(fullPath) // report.docx
    dir := filepath.Dir(fullPath)       // /home/user/documents
    extension := filepath.Ext(fullPath) // .docx

    fmt.Printf("Имя файла: %sn", fileName)
    fmt.Printf("Директория: %sn", dir)
    fmt.Printf("Расширение: %sn", extension)
}

Итог:

  • Используйте os.Stat, когда вам нужна актуальная информация о файле (размер, дата, права) и вы уверены, что он существует.
  • Используйте path/filepath, когда вам нужно разобрать строку пути на компоненты, независимо от существования файла.