os.WriteFile în Go

Scrie octeții dați într-un fișier: îl creează dacă lipsește și îi înlocuiește conținutul dacă există.

Sintaxă
func WriteFile(name string, data []byte, perm FileMode) error

Ce face os.WriteFile

os.WriteFile creează fișierul (sau îl golește, dacă există deja), scrie tot conținutul și îl închide. Este perechea lui os.ReadFile și se potrivește când ai deja toate datele în memorie.

Al treilea argument, perm, este folosit doar când fișierul este creat. Valoarea obișnuită este 0o644: proprietarul poate citi și scrie, ceilalți doar citesc. Sistemul aplică și masca umask, așa că drepturile finale pot fi mai restrictive.

Pentru a adăuga la sfârșitul unui fișier (fără să-l ștergi), nu folosi WriteFile: deschide fișierul cu os.OpenFile și opțiunea os.O_APPEND.

Parametri

Parametru Descriere
name Calea fișierului.
data Octeții de scris. Pentru text: []byte("text").
perm Drepturile pentru un fișier nou, în octal: 0o644, 0o600 (doar proprietarul) etc.

Ce returnează

nil dacă totul a mers bine, altfel eroarea (director inexistent, lipsă drepturi, disc plin).

Exemple

Exemplul 1: Scriere și recitire

package main

import (
    "fmt"
    "os"
)

func main() {
    text := "Comanda 1042\nClient: Ana Popescu\nOraș: Iași\nTotal: 249,90 lei\n"
    if err := os.WriteFile("comanda.txt", []byte(text), 0o644); err != nil {
        fmt.Println("eroare:", err)
        return
    }
    date, _ := os.ReadFile("comanda.txt")
    fmt.Print(string(date))
}

Rezultat

Comanda 1042
Client: Ana Popescu
Oraș: Iași
Total: 249,90 lei

Exemplul 2: WriteFile înlocuiește conținutul vechi

A doua scriere golește fișierul înainte. Al doilea fragment folosește os.OpenFile cu O_APPEND ca să adauge la final.

package main

import (
    "fmt"
    "os"
)

func main() {
    os.WriteFile("jurnal.txt", []byte("luni: 3 comenzi\n"), 0o644)
    os.WriteFile("jurnal.txt", []byte("marți: 5 comenzi\n"), 0o644)
    date, _ := os.ReadFile("jurnal.txt")
    fmt.Print("După două WriteFile:\n", string(date))

    f, err := os.OpenFile("jurnal.txt", os.O_APPEND|os.O_WRONLY, 0o644)
    if err != nil {
        fmt.Println("eroare:", err)
        return
    }
    f.WriteString("miercuri: 2 comenzi\n")
    f.Close()

    date, _ = os.ReadFile("jurnal.txt")
    fmt.Print("După adăugare cu O_APPEND:\n", string(date))
}

Rezultat

După două WriteFile:
marți: 5 comenzi
După adăugare cu O_APPEND:
marți: 5 comenzi
miercuri: 2 comenzi

Exemplul 3: Directorul trebuie să existe

WriteFile nu creează directoarele din cale. Le creezi înainte cu os.MkdirAll.

package main

import (
    "fmt"
    "os"
)

func main() {
    err := os.WriteFile("rapoarte/martie.txt", []byte("vânzări: 1200 lei\n"), 0o644)
    fmt.Println("prima încercare:", err)

    os.MkdirAll("rapoarte", 0o755)
    err = os.WriteFile("rapoarte/martie.txt", []byte("vânzări: 1200 lei\n"), 0o644)
    fmt.Println("după MkdirAll:", err)
}

Rezultat

prima încercare: open rapoarte/martie.txt: no such file or directory
după MkdirAll: <nil>

Greșeli frecvente

  • Scrii permisiunea în zecimal: 644 în loc de 0o644 (sau 0644). Numărul zecimal 644 înseamnă alte drepturi, ciudate.
  • Folosești WriteFile într-o buclă ca să adaugi rânduri. Fiecare apel șterge ce era înainte; rămâne doar ultimul rând.
  • Te aștepți ca WriteFile să schimbe drepturile unui fișier existent. perm contează doar la creare; pentru un fișier existent folosește os.Chmod.

Comenzi înrudite

  • os.ReadFile: Citește tot conținutul unui fișier într-un slice de octeți, dintr-un singur apel.
  • os.MkdirAll: Creează un director împreună cu toți părinții care lipsesc; nu dă eroare dacă directorul există deja.
  • os.File.Write: Scrie octeți (Write) sau text (WriteString) în fișier, la poziția curentă.
  • os.Chmod: Schimbă drepturile de acces (citire, scriere, execuție) ale unui fișier sau director.
  • bufio.NewWriter: Învelește un io.Writer într-un bufio.Writer, care strânge scrierile mici într-un buffer și le trimite în blocuri.