os.Create în Go

Creează un fișier nou (sau golește unul existent) și îl deschide pentru scriere și citire.

Sintaxă
func Create(name string) (*File, error)

Ce face os.Create

os.Create creează fișierul dacă nu există, cu drepturile 0o666 (din care sistemul scade masca umask, de obicei rezultă 0o644). Dacă fișierul există deja, îl golește (îl trunchiază la 0 octeți). Este echivalent cu os.OpenFile(nume, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0o666).

Îl folosești când scrii un fișier bucată cu bucată: rânduri de CSV, un raport, rezultatul lui io.Copy. Directorul părinte trebuie să existe. Pentru a adăuga la un fișier existent, folosește os.OpenFile cu os.O_APPEND.

Parametri

Parametru Descriere
name Calea fișierului de creat.

Ce returnează

Fișierul deschis și nil, sau nil și o eroare.

Exemple

Exemplul 1: Scrierea unui raport

package main

import (
    "fmt"
    "os"
)

func main() {
    f, err := os.Create("raport.csv")
    if err != nil {
        fmt.Println("eroare:", err)
        return
    }
    defer f.Close()

    fmt.Fprintln(f, "produs,cantitate,pret")
    vanzari := []struct {
        produs    string
        cantitate int
        pret      float64
    }{{"cafea", 3, 32.5}, {"ceai", 10, 12}}
    for _, v := range vanzari {
        fmt.Fprintf(f, "%s,%d,%.2f\n", v.produs, v.cantitate, v.pret)
    }

    date, _ := os.ReadFile("raport.csv")
    fmt.Print(string(date))
}

Rezultat

produs,cantitate,pret
cafea,3,32.50
ceai,10,12.00

Exemplul 2: Create golește fișierul existent

package main

import (
    "fmt"
    "os"
)

func main() {
    os.WriteFile("lista.txt", []byte("pâine\nlapte\nouă\n"), 0o644)

    f, _ := os.Create("lista.txt")
    f.WriteString("doar cafea\n")
    f.Close()

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

Rezultat

"doar cafea\n"

Exemplul 3: Directorul trebuie să existe

package main

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

func creeaza(cale string) (*os.File, error) {
    if err := os.MkdirAll(filepath.Dir(cale), 0o755); err != nil {
        return nil, err
    }
    return os.Create(cale)
}

func main() {
    _, err := os.Create("export/2025/clienti.csv")
    fmt.Println("direct:", err)

    f, err := creeaza("export/2025/clienti.csv")
    fmt.Println("cu MkdirAll:", err)
    if err == nil {
        fmt.Println("creat:", f.Name())
        f.Close()
    }
}

Rezultat

direct: open export/2025/clienti.csv: no such file or directory
cu MkdirAll: <nil>
creat: export/2025/clienti.csv

Greșeli frecvente

  • Folosești os.Create pe un fișier pe care voiai doar să-l completezi. Conținutul vechi se pierde fără avertisment.
  • Ignori eroarea lui Close după scriere. Pe unele sisteme, problemele de scriere apar abia la închidere.
  • Scrii mii de rânduri mici direct în fișier. Învelește-l în bufio.NewWriter și apelează Flush la final.

Comenzi înrudite

  • os.Open: Deschide un fișier existent doar pentru citire și returnează un *os.File.
  • os.OpenFile: Deschide un fișier cu opțiuni alese de tine: citire, scriere, adăugare la final, creare, golire, creare exclusivă.
  • 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.CreateTemp: Creează și deschide un fișier temporar nou, cu nume unic, și îl returnează ca *os.File.
  • bufio.NewWriter: Învelește un io.Writer într-un bufio.Writer, care strânge scrierile mici într-un buffer și le trimite în blocuri.
  • os.File.Write: Scrie octeți (Write) sau text (WriteString) în fișier, la poziția curentă.