os.Truncate în Go

Schimbă dimensiunea unui fișier: taie ce depășește sau completează cu octeți zero.

Sintaxă
func Truncate(name string, size int64) error
func (f *File) Truncate(size int64) error

Ce face os.Truncate

os.Truncate aduce fișierul la exact size octeți. Dacă fișierul era mai mare, restul se pierde. Dacă era mai mic, se completează cu octeți 0. os.Truncate(nume, 0) golește fișierul.

Metoda (*os.File).Truncate face același lucru pe un fișier deja deschis pentru scriere. Atenție: nu mută poziția de scriere; după f.Truncate(0) apelează și f.Seek(0, io.SeekStart), altfel următoarea scriere lasă o gaură de octeți zero la început.

Parametri

Parametru Descriere
name Calea fișierului (doar pentru os.Truncate).
size Dimensiunea nouă, în octeți.

Ce returnează

nil la succes sau eroarea.

Exemple

Exemplul 1: Tăierea unui fișier

package main

import (
    "fmt"
    "os"
)

func main() {
    os.WriteFile("mesaj.txt", []byte("Salut din Iași!"), 0o644)
    os.Truncate("mesaj.txt", 5)
    date, _ := os.ReadFile("mesaj.txt")
    fmt.Printf("%q\n", date)

    os.Truncate("mesaj.txt", 8) // mai mare: completează cu zero
    date, _ = os.ReadFile("mesaj.txt")
    fmt.Printf("%q (%d octeți)\n", date, len(date))
}

Rezultat

"Salut"
"Salut\x00\x00\x00" (8 octeți)

Exemplul 2: Rescrierea unui fișier deschis

f.Truncate(0) golește fișierul, iar Seek mută poziția la început.

package main

import (
    "fmt"
    "io"
    "os"
)

func main() {
    os.WriteFile("contor.txt", []byte("vizite: 99"), 0o644)

    f, err := os.OpenFile("contor.txt", os.O_RDWR, 0)
    if err != nil {
        fmt.Println("eroare:", err)
        return
    }
    f.Truncate(0)
    f.Seek(0, io.SeekStart)
    f.WriteString("vizite: 100")
    f.Close()

    date, _ := os.ReadFile("contor.txt")
    fmt.Printf("%q\n", date)
}

Rezultat

"vizite: 100"

Exemplul 3: Ce se întâmplă fără Seek

Poziția rămâne după ultimul octet scris, așa că noul text ajunge după 10 octeți zero.

package main

import (
    "fmt"
    "os"
)

func main() {
    f, _ := os.Create("contor.txt")
    f.WriteString("vizite: 99")
    f.Truncate(0)
    f.WriteString("100")
    f.Close()

    date, _ := os.ReadFile("contor.txt")
    fmt.Printf("%q\n", date)
}

Rezultat

"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00100"

Greșeli frecvente

  • Uiți Seek(0, io.SeekStart) după f.Truncate(0) și fișierul începe cu octeți zero.
  • Apelezi Truncate pe un fișier deschis doar pentru citire (os.Open). Primești eroare; deschide-l cu os.O_RDWR sau os.O_WRONLY.

Comenzi înrudite

  • os.File.Seek: Mută poziția curentă de citire/scriere din fișier, față de început, de poziția curentă sau de final.
  • os.WriteFile: Scrie octeții dați într-un fișier: îl creează dacă lipsește și îi înlocuiește conținutul dacă există.
  • os.File: Tipul care reprezintă un fișier deschis; îl obții cu os.Open, os.Create sau os.OpenFile.
  • os.File.Write: Scrie octeți (Write) sau text (WriteString) în fișier, la poziția curentă.