Ajouter à un fichier dans Go

87

Je peux donc lire à partir d'un fichier local comme ceci:

data, error := ioutil.ReadFile(name)

Et je peux écrire dans un fichier local

ioutil.WriteFile(filename, content, permission)

Mais comment puis-je ajouter à un fichier? Existe-t-il une méthode intégrée?

Seveibar
la source
4
Oui, vous l'avez. Les fonctions ioutil ne sont que des commodités qui prennent en charge les tâches courantes. Si vous voulez plus de contrôle, consultez le package os.
Evan Shaw

Réponses:

147

Cette réponse fonctionne dans Go1:

f, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0600)
if err != nil {
    panic(err)
}

defer f.Close()

if _, err = f.WriteString(text); err != nil {
    panic(err)
}
Sridhar Ratnakumar
la source
3
Pourquoi pas le mode fichier 0666? Je pensais que c'était une meilleure valeur par défaut.
Dmitri Shuralyov
1
@SridharRatnakumar: voir un autre commentaire et man umask . Avec un umask typique de 022, vous obtiendrez des permissions typiques:0666 & ~022 = 0644 = rw-r--r--
akavel
55
os.O_CREATE est agréable à inclure si le fichier n'existe peut-être pas déjà.
bugloaf
2
peut-être une question un peu stupide mais pourquoi aurait-il besoin des deux os.O_APPENDet os.O_WRONLY? Cela fonctionne bien sûr mais pourquoi les deux?
Dusan Gligoric
51

Go docs a un exemple parfait :

package main

import (
    "log"
    "os"
)

func main() {
    // If the file doesn't exist, create it, or append to the file
    f, err := os.OpenFile("access.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
    if err != nil {
        log.Fatal(err)
    }
    if _, err := f.Write([]byte("appended some data\n")); err != nil {
        log.Fatal(err)
    }
    if err := f.Close(); err != nil {
        log.Fatal(err)
    }
}
Jimmy Obonyo Abor
la source
5

... J'utiliserais fmt.Fprintf, car accepter un écrivain ... et une connexion ou des fichiers seront un écrivain et facile à écrire sous forme de chaîne ...

f, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY, 0600)
if err != nil {
    panic(err)
}

defer f.Close()
fmt.Fprintf(f, "%s", text)

J'espère que cette aide!

Javier,

Javier Gutiérrez-Maturana Sánc
la source
3

Si vous souhaitez également créer le fichier

f, err := os.OpenFile(filename, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600)

Luke W
la source
0

Disons que vous voulez ajouter le contenu du fichier currentau fichier all, puis le code ci-dessous fonctionne:

func updateTrx() {
    var err error
    var f *os.File

    // If the file doesn't exist, create it, or append to the file
    if f, err = os.OpenFile("all.csv", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644); err != nil {
        log.Fatal(err)
    }
    defer func() {
        if err := f.Close(); err != nil {
            log.Fatal("error", err)
        }
    }()

    var current *os.File
    if current, err = os.OpenFile("current.csv", os.O_RDONLY, 0); err != nil {
        log.Fatal("error", err)
    }

    defer func() {
        if err := current.Close(); err != nil {
            log.Fatal("error", err)
        }
    }()

    if fileBytes, err := ioutil.ReadAll(current); err != nil {
        log.Fatal("error", err)
    } else {
        if _, err := f.Write([]byte(fileBytes)); err != nil {
            log.Fatal(err)
        }
    }
}
Hasan A Yousef
la source