Travailler avec le système de fichiers en Go : des bases aux techniques avancées
Go (Golang) est un langage de programmation compilé moderne, réputé pour ses performances, sa simplicité et sa prise en charge intégrée du système de fichiers. La capacité à lire, écrire, créer et gérer efficacement des fichiers et des répertoires est une compétence clé pour tout développeur Go. Dans cet article, nous allons détailler les opérations fondamentales sur le système de fichiers en utilisant la bibliothèque standard os, io/ioutil (à partir de Go 1.16, il est recommandé d'utiliser os et io) et path/filepath. Vous apprendrez à ouvrir et fermer des fichiers, lire et écrire des données, travailler avec des répertoires et parcourir des arborescences de fichiers.
1. Bases : ouverture, lecture et écriture de fichiers
Le travail avec les fichiers en Go commence avec le package os. Pour ouvrir un fichier, on utilise la fonction os.Open (lecture seule) ou os.OpenFile (lecture et écriture avec spécification du mode). Après utilisation, le fichier doit impérativement être fermé avec defer file.Close() pour libérer les ressources système.
Lecture complète d'un fichier
La façon la plus simple de lire un fichier est d'utiliser os.ReadFile (disponible depuis Go 1.16). Elle retourne une tranche d'octets et une erreur.
package main
import ( "fmt" "os")
func main() { data, err := os.ReadFile("example.txt") if err != nil { fmt.Println("Erreur de lecture du fichier :", err) return } fmt.Println("Contenu du fichier :") fmt.Println(string(data))}Écriture dans un fichier
Pour écrire des données dans un fichier, on utilise os.WriteFile. Il crée ou écrase le fichier.
package main
import ( "os")
func main() { content := []byte("Bonjour le monde !Ceci est une ligne à écrire.") err := os.WriteFile("output.txt", content, 0644) if err != nil { panic(err) }}Notez le troisième argument — 0644. Ce sont les permissions d'accès au fichier en style Unix (le propriétaire peut lire et écrire, les autres peuvent seulement lire).
Lecture et écriture avec tampon
Pour les gros fichiers ou le traitement en flux, utilisez bufio :
package main
import ( "bufio" "fmt" "os")
func main() { file, err := os.Open("large.txt") if err != nil { panic(err) } defer file.Close()
scanner := bufio.NewScanner(file) for scanner.Scan() { fmt.Println(scanner.Text()) } if err := scanner.Err(); err != nil { fmt.Println("Erreur de scan :", err) }}2. Travail avec les répertoires
Go fournit des fonctions pratiques pour créer, supprimer et lire des répertoires. Les principales se trouvent dans le package os.
Création d'un répertoire
Pour créer un seul répertoire, utilisez os.Mkdir, pour des répertoires imbriqués — os.MkdirAll.
package main
import ( "os")
func main() { // Créer un seul répertoire err := os.Mkdir("newdir", 0755) if err != nil { panic(err) }
// Créer des répertoires imbriqués err = os.MkdirAll("path/to/nested/dir", 0755) if err != nil { panic(err) }}Lecture du contenu d'un répertoire
La fonction os.ReadDir retourne une liste des éléments dans un répertoire (depuis Go 1.16).
package main
import ( "fmt" "os")
func main() { entries, err := os.ReadDir(".") if err != nil { panic(err) }
for _, entry := range entries { fmt.Println(entry.Name(), entry.IsDir()) }}Suppression de fichiers et de répertoires
Pour la suppression, utilisez os.Remove (pour un fichier ou un répertoire vide) et os.RemoveAll