Travail avec le système de fichiers en Go : en pratique

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Travail avec le système de fichiers en Go : en pratique

\n\n

Travailler avec le système de fichiers est l'une des tâches fondamentales de toute application serveur. Le langage Go (Golang) offre une boîte à outils puissante et élégante pour lire, écrire, supprimer et gérer les fichiers et répertoires. Dans cet article, nous analyserons des exemples pratiques de manipulation de fichiers en Go, en utilisant les packages standards os, io/ioutil (avant Go 1.16) et io. Vous apprendrez à gérer efficacement les données sur le disque, à traiter les erreurs et à écrire un code propre.

\n\n

1. Bases : ouverture, lecture et écriture de fichiers

\n\n

Commençons par les opérations les plus courantes. Pour ouvrir un fichier, on utilise la fonction os.OpenFile ou des wrappers plus simples os.Create et os.Open. Voici un exemple de lecture d'un fichier entier en mémoire :

\n\n
package main\n\nimport (\n    "fmt"\n    "os"\n)\n\nfunc main() {\n    // Lecture du fichier entier (avant Go 1.16, on utilisait ioutil.ReadFile)\n    data, err := os.ReadFile("example.txt")\n    if err != nil {\n        fmt.Println("Erreur de lecture du fichier :", err)\n        return\n    }\n    fmt.Println("Contenu du fichier :")\n    fmt.Println(string(data))\n}\n
\n\n

Pour écrire des données dans un fichier, utilisez os.WriteFile :

\n\n
package main\n\nimport (\n    "os"\n)\n\nfunc main() {\n    content := []byte("Bonjour, monde Go !\\nDeuxième ligne.")\n    err := os.WriteFile("output.txt", content, 0644)\n    if err != nil {\n        panic(err)\n    }\n    // Le fichier output.txt est créé et contient notre texte\n}\n
\n\n

Si vous devez ajouter des données à la fin d'un fichier, utilisez les flags :

\n\n
file, err := os.OpenFile("log.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)\nif err != nil {\n    panic(err)\n}\ndefer file.Close()\n\nif _, err := file.WriteString("Nouvelle entrée dans le log\\n"); err != nil {\n    panic(err)\n}\n
\n\n

2. Travail avec les répertoires : création, suppression et parcours

\n\n

La gestion des dossiers est une tâche tout aussi importante. Créer un nouveau répertoire peut se faire avec os.Mkdir (un seul dossier) ou os.MkdirAll (récursivement, comme mkdir -p) :

\n\n
package main\n\nimport (\n    "fmt"\n    "os"\n)\n\nfunc main() {\n    // Création d'un seul dossier\n    err := os.Mkdir("data", 0755)\n    if err != nil {\n        fmt.Println("Erreur de création du dossier :", err)\n    }\n\n    // Création récursive d'une structure imbriquée\n    err = os.MkdirAll("data/subdir/logs", 0755)\n    if err != nil {\n        fmt.Println("Erreur :", err)\n    }\n}\n
\n\n

Pour parcourir un répertoire, on peut utiliser la fonction os.ReadDir (remplacement de ioutil.ReadDir) :

\n\n
entries, err := os.ReadDir(".")\nif err != nil {\n    panic(err)\n}\n\nfor _, entry := range entries {\n    fmt.Printf("Nom : %s, Dossier : %t\\n", entry.Name(), entry.IsDir())\n}\n
\n\n

Et pour un parcours récursif de tous les fichiers et dossiers, utilisez filepath.Walk du package path/filepath :

\n\n
package main\n\nimport (\n    "fmt"\n    "os"\n    "path/filepath"\n)\n\nfunc main() {\n    err := filepath.Walk(".", func(path string, info os.FileInfo, err error) error {\n        if err != nil {\n            return err\n        }\n        fmt.Println(path)\n        return nil\n    })\n    if err != nil {\n        fmt.Println("Erreur de parcours :", err)\n    }\n}\n
\n\n

La suppression de fichiers et de dossiers se fait avec les fonctions os.Remove et os.RemoveAll :

\n\n
// Supprimer un seul fichier ou un dossier vide\nos.Remove("temp.txt")\n\n// Supprimer un dossier avec tout son contenu (équivalent de rm -rf)\nos.RemoveAll("data")\n
\n\n

3. Techniques avancées : entrée/sortie bufferisée et travail avec les fichiers temporaires

\n\n

Pour les gros fichiers, il n'est pas efficace de lire tout le contenu en mémoire. Utilisez la lecture bufferisée avec bufio :

\n\n
package main\n\nimport (\n    "bufio"\n    "                

Blogs

Book Recommendations