Ответ
В 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
, когда вам нужно разобрать строку пути на компоненты, независимо от существования файла.