os.Chtimes în Go

Schimbă data ultimului acces și data ultimei modificări ale unui fișier.

Sintaxă
func Chtimes(name string, atime time.Time, mtime time.Time) error

Ce face os.Chtimes

os.Chtimes setează două date ale fișierului: atime (ultimul acces) și mtime (ultima modificare), ca touch -t din terminal. Data modificării se citește apoi cu info.ModTime().

Un time.Time gol (time.Time{}) lasă data respectivă neschimbată. Sistemul de fișiere poate rotunji timpul (de exemplu la secunde).

Parametri

Parametru Descriere
name Calea fișierului.
atime Data ultimului acces.
mtime Data ultimei modificări.

Ce returnează

nil la succes sau o eroare *fs.PathError.

Exemple

Exemplul 1: Setarea datei de modificare

package main

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

func main() {
    os.WriteFile("poza.jpg", []byte("..."), 0o644)
    t := time.Date(2024, time.August, 15, 18, 30, 0, 0, time.UTC)

    if err := os.Chtimes("poza.jpg", t, t); err != nil {
        fmt.Println("eroare:", err)
        return
    }
    info, _ := os.Stat("poza.jpg")
    fmt.Println("modificat:", info.ModTime().UTC().Format("2006-01-02 15:04"))
}

Rezultat

modificat: 2024-08-15 18:30

Exemplul 2: Sortarea fișierelor după dată

Dăm fiecărui raport o dată fixă, apoi le sortăm de la cel mai nou cu slices.SortFunc.

package main

import (
    "fmt"
    "os"
    "path/filepath"
    "slices"
    "time"
)

func main() {
    os.Mkdir("rapoarte", 0o755)
    date := map[string]time.Time{
        "ianuarie.csv":  time.Date(2025, time.February, 1, 9, 0, 0, 0, time.UTC),
        "februarie.csv": time.Date(2025, time.March, 1, 9, 0, 0, 0, time.UTC),
        "martie.csv":    time.Date(2025, time.April, 1, 9, 0, 0, 0, time.UTC),
    }
    for nume, t := range date {
        cale := filepath.Join("rapoarte", nume)
        os.WriteFile(cale, []byte("date"), 0o644)
        os.Chtimes(cale, t, t)
    }

    intrari, _ := os.ReadDir("rapoarte")
    var fisiere []os.FileInfo
    for _, e := range intrari {
        info, _ := e.Info()
        fisiere = append(fisiere, info)
    }
    slices.SortFunc(fisiere, func(a, b os.FileInfo) int { return b.ModTime().Compare(a.ModTime()) })
    for _, f := range fisiere {
        fmt.Println(f.ModTime().UTC().Format("2006-01-02"), f.Name())
    }
}

Rezultat

2025-04-01 martie.csv
2025-03-01 februarie.csv
2025-02-01 ianuarie.csv

Exemplul 3: Doar data modificării

time.Time{} pentru atime lasă data accesului cum era.

package main

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

func main() {
    os.WriteFile("nota.txt", []byte("..."), 0o644)
    noua := time.Date(2023, time.December, 24, 12, 0, 0, 0, time.UTC)
    fmt.Println(os.Chtimes("nota.txt", time.Time{}, noua))

    info, _ := os.Stat("nota.txt")
    fmt.Println(info.ModTime().UTC())
}

Rezultat

<nil>
2023-12-24 12:00:00 +0000 UTC

Greșeli frecvente

  • Compari datele fără să ții cont de fusul orar. ModTime() e în ora locală; pentru comparații și afișări stabile folosește .UTC() sau metoda Equal.

Comenzi înrudite

  • os.File.Stat: Returnează informații despre fișierul deschis: nume, dimensiune, drepturi, data modificării, dacă e director.
  • os.Chmod: Schimbă drepturile de acces (citire, scriere, execuție) ale unui fișier sau director.
  • os.Truncate: Schimbă dimensiunea unui fișier: taie ce depășește sau completează cu octeți zero.