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 de0o644(sau0644). 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
WriteFilesă schimbe drepturile unui fișier existent.permcontează doar la creare; pentru un fișier existent foloseșteos.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.