os.File.Stat în Go

Returnează informații despre fișierul deschis: nume, dimensiune, drepturi, data modificării, dacă e director.

Sintaxă
func (f *File) Stat() (FileInfo, error)

Ce face os.File.Stat

Stat returnează un os.FileInfo cu metodele Name(), Size() (octeți), Mode() (tip și drepturi), ModTime(), IsDir().

Funcția os.Stat(nume) dă aceleași informații fără să deschizi fișierul, iar os.Lstat nu urmează legăturile simbolice. Metoda f.Stat() e utilă când fișierul e deja deschis, de exemplu ca să afli dimensiunea înainte de citire.

Ce returnează

Un FileInfo și nil, sau o eroare.

Exemple

Exemplul 1: Informații despre un fișier

package main

import (
    "fmt"
    "os"
    "time"
)

func main() {
    os.WriteFile("raport.pdf", make([]byte, 2048), 0o644)
    t := time.Date(2025, time.May, 10, 14, 0, 0, 0, time.UTC)
    os.Chtimes("raport.pdf", t, t)
    os.Chmod("raport.pdf", 0o640)

    f, _ := os.Open("raport.pdf")
    defer f.Close()
    info, err := f.Stat()
    if err != nil {
        fmt.Println("eroare:", err)
        return
    }
    fmt.Println("nume:      ", info.Name())
    fmt.Println("dimensiune:", info.Size(), "octeți")
    fmt.Println("drepturi:  ", info.Mode())
    fmt.Println("modificat: ", info.ModTime().UTC().Format("02.01.2006 15:04"))
    fmt.Println("director:  ", info.IsDir())
}

Rezultat

nume:       raport.pdf
dimensiune: 2048 octeți
drepturi:   -rw-r-----
modificat:  10.05.2025 14:00
director:   false

Exemplul 2: Refuzarea fișierelor prea mari

package main

import (
    "fmt"
    "os"
)

const limita = 1024 // octeți

func citeste(nume string) ([]byte, error) {
    f, err := os.Open(nume)
    if err != nil {
        return nil, err
    }
    defer f.Close()
    info, err := f.Stat()
    if err != nil {
        return nil, err
    }
    if info.Size() > limita {
        return nil, fmt.Errorf("%s are %d octeți, limita este %d", nume, info.Size(), limita)
    }
    date := make([]byte, info.Size())
    _, err = f.Read(date)
    return date, err
}

func main() {
    os.WriteFile("mic.txt", []byte("salut"), 0o644)
    os.WriteFile("mare.bin", make([]byte, 5000), 0o644)

    date, err := citeste("mic.txt")
    fmt.Printf("%q %v\n", date, err)
    _, err = citeste("mare.bin")
    fmt.Println(err)
}

Rezultat

"salut" <nil>
mare.bin are 5000 octeți, limita este 1024

Greșeli frecvente

  • Folosești Size() pentru un director sau un fișier special (pipe, /proc) și te bazezi pe valoare. Pentru acestea dimensiunea nu are sens sau este 0.

Comenzi înrudite

  • os.File: Tipul care reprezintă un fișier deschis; îl obții cu os.Open, os.Create sau os.OpenFile.
  • os.Chmod: Schimbă drepturile de acces (citire, scriere, execuție) ale unui fișier sau director.
  • os.Chtimes: Schimbă data ultimului acces și data ultimei modificări ale unui fișier.
  • os.SameFile: Spune dacă două FileInfo descriu același fișier de pe disc, chiar dacă au căi diferite.
  • os.File.Name: Returnează numele cu care a fost deschis fișierul (calea dată la Open sau Create).
  • os.Stat: Returnează informațiile unui fișier (dimensiune, drepturi, dată, director sau nu) fără să-l deschidă; Lstat nu urmează legăturile.