Leçon 10 - Fichiers et Sérialisation

P2 - Persistance des données

Apprenez à sauvegarder et charger des données avec les fichiers et la sérialisation JSON.

Introduction aux fichiers

La manipulation de fichiers permet de sauvegarder des données de manière persistante. C# offre de nombreuses méthodes pour lire et écrire des fichiers texte, binaires, ou sérialisés.

Lecture et écriture de fichiers texte

Les fichiers texte sont les plus simples à manipuler. Voici les opérations de base :

Écrire dans un fichier

C#
using System; using System.IO; // Écrire une ligne dans un fichier (écrase le contenu existant) File.WriteAllText("message.txt", "Bonjour le monde!"); // Écrire plusieurs lignes string[] lignes = { "Ligne 1", "Ligne 2", "Ligne 3" }; File.WriteAllLines("liste.txt", lignes); // Ajouter du texte à la fin du fichier (sans écraser) File.AppendAllText("message.txt", "\nNouvelle ligne"); Console.WriteLine("✅ Fichiers créés avec succès!");

Lire depuis un fichier

C#
using System; using System.IO; // Vérifier si le fichier existe avant de lire if (File.Exists("message.txt")) { // Lire tout le contenu en une fois string contenu = File.ReadAllText("message.txt"); Console.WriteLine("Contenu du fichier:"); Console.WriteLine(contenu); // Lire toutes les lignes dans un tableau string[] lignes = File.ReadAllLines("message.txt"); Console.WriteLine($"\nNombre de lignes: {lignes.Length}"); // Parcourir ligne par ligne foreach (string ligne in lignes) { Console.WriteLine($"- {ligne}"); } } else { Console.WriteLine("❌ Le fichier n'existe pas"); }

StreamReader et StreamWriter

Pour un contrôle plus fin sur la lecture/écriture, utilisez les streams :

C#
// Écriture avec StreamWriter using (StreamWriter writer = new StreamWriter("journal.txt", true)) // true = append { writer.WriteLine($"{DateTime.Now}: Début de l'application"); writer.WriteLine($"{DateTime.Now}: Opération effectuée"); } // Lecture avec StreamReader using (StreamReader reader = new StreamReader("journal.txt")) { string ligne; while ((ligne = reader.ReadLine()) != null) { Console.WriteLine(ligne); } }

Manipulation de chemins et répertoires

C#
using System.IO; // Créer un répertoire string dossier = "MesDonnees"; if (!Directory.Exists(dossier)) { Directory.CreateDirectory(dossier); Console.WriteLine($"📁 Dossier '{dossier}' créé"); } // Chemins combinés de manière sûre string cheminFichier = Path.Combine(dossier, "donnees.txt"); File.WriteAllText(cheminFichier, "Contenu sauvegardé"); // Obtenir des informations sur un fichier FileInfo info = new FileInfo(cheminFichier); Console.WriteLine($"Nom: {info.Name}"); Console.WriteLine($"Taille: {info.Length} octets"); Console.WriteLine($"Créé: {info.CreationTime}"); Console.WriteLine($"Modifié: {info.LastWriteTime}"); // Lister les fichiers d'un dossier string[] fichiers = Directory.GetFiles(dossier); Console.WriteLine($"\nFichiers dans '{dossier}':"); foreach (string fichier in fichiers) { Console.WriteLine($"- {Path.GetFileName(fichier)}"); }

Sérialisation JSON

JSON est le format standard pour sauvegarder des objets complexes. C# offre System.Text.Json pour cela :

C#
using System; using System.Text.Json; using System.IO; using System.Collections.Generic; public class Personne { public string Nom { get; set; } public string Prenom { get; set; } public int Age { get; set; } public List<string> Hobbies { get; set; } } // Créer un objet Personne personne = new Personne { Nom = "Dupont", Prenom = "Alice", Age = 28, Hobbies = new List<string> { "Lecture", "Programmation", "Yoga" } }; // Sérialiser en JSON avec indentation JsonSerializerOptions options = new JsonSerializerOptions { WriteIndented = true }; string json = JsonSerializer.Serialize(personne, options); // Sauvegarder dans un fichier File.WriteAllText("personne.json", json); Console.WriteLine("✅ Objet sauvegardé en JSON"); Console.WriteLine(json);

Désérialisation JSON

C#
// Lire depuis le fichier JSON if (File.Exists("personne.json")) { string jsonLu = File.ReadAllText("personne.json"); // Désérialiser en objet C# Personne personneLue = JsonSerializer.Deserialize<Personne>(jsonLu); Console.WriteLine("\n📖 Objet chargé depuis JSON:"); Console.WriteLine($"Nom: {personneLue.Prenom} {personneLue.Nom}"); Console.WriteLine($"Âge: {personneLue.Age} ans"); Console.WriteLine("Hobbies:"); foreach (string hobby in personneLue.Hobbies) { Console.WriteLine($" - {hobby}"); } }

Sauvegarder une collection

C#
public class Contact { public string Nom { get; set; } public string Email { get; set; } public string Telephone { get; set; } } public class Carnet { public string NomProprietaire { get; set; } public List<Contact> Contacts { get; set; } = new List<Contact>(); } // Créer un carnet d'adresses Carnet carnet = new Carnet { NomProprietaire = "Alice Dupont", Contacts = new List<Contact> { new Contact { Nom = "Bob Martin", Email = "bob@example.com", Telephone = "0601020304" }, new Contact { Nom = "Claire Dubois", Email = "claire@example.com", Telephone = "0605060708" } } }; // Sauvegarder string jsonCarnet = JsonSerializer.Serialize(carnet, new JsonSerializerOptions { WriteIndented = true }); File.WriteAllText("carnet.json", jsonCarnet); // Charger string jsonCharge = File.ReadAllText("carnet.json"); Carnet carnetCharge = JsonSerializer.Deserialize<Carnet>(jsonCharge); Console.WriteLine($"Carnet de: {carnetCharge.NomProprietaire}"); Console.WriteLine($"Nombre de contacts: {carnetCharge.Contacts.Count}");
Gestion des erreurs avec fichiers :

Toujours entourer les opérations de fichiers d'un try-catch pour gérer les erreurs :

  • FileNotFoundException : Fichier introuvable
  • UnauthorizedAccessException : Permissions insuffisantes
  • IOException : Erreur générale d'entrée/sortie
  • JsonException : Format JSON invalide

Exercice pratique

Exercice :

Créez un système de gestion de tâches avec sauvegarde JSON :

  1. Une classe Tache avec titre, description, priorité, statut, date
  2. Une classe GestionnaireTaches pour gérer la liste
  3. Méthodes pour ajouter, supprimer, marquer comme terminée
  4. Sauvegarde automatique en JSON après chaque modification
  5. Chargement automatique au démarrage

Points clés à retenir