Chargement...

Entrées/Sorties de fichiers et API Stream en C#

Apprenez les entrées/sorties de fichiers et l’API Stream en C# pour lire et écrire des données efficacement.

En C#, File IO (Input/Output) et l’API Stream sont les mécanismes de base pour la lecture et l’écriture de fichiers. Les fichiers peuvent être traités comme du texte ou en binaire, et l’approche par flux (stream) permet de manipuler efficacement de grandes données sans tout charger en mémoire. Dans cet article, nous allons couvrir File, FileInfo, StreamReader/StreamWriter, FileStream et BinaryReader/BinaryWriter avec des exemples complets.


Classe File

La classe File fournit des méthodes statiques pour des opérations rapides sur les fichiers. Les méthodes les plus utilisées sont : WriteAllText, ReadAllText, AppendAllText, Exists, Delete.


using System;
using System.IO;

// Écrire dans un fichier
File.WriteAllText("demo.txt", "Bonjour le monde!");

// Lire un fichier
string contenu = File.ReadAllText("demo.txt");
Console.WriteLine(contenu);

// Vérifier si le fichier existe
if (File.Exists("demo.txt"))
    Console.WriteLine("Le fichier existe.");

// Ajouter à un fichier
File.AppendAllText("demo.txt", "\nNouvelle ligne ajoutée.");

// Supprimer un fichier
File.Delete("temp.txt");

Classe FileInfo

FileInfo est basée sur des instances et fournit des informations détaillées et des opérations sur les fichiers. Elle contient des méthodes comme Exists, Create, Delete, CopyTo et MoveTo.


var info = new FileInfo("exemple.txt");

// Créer le fichier s’il n’existe pas
if (!info.Exists)
{
    using (var sw = info.CreateText())
        sw.WriteLine("Ce fichier a été créé avec FileInfo.Create.");
}

// Afficher les informations du fichier
Console.WriteLine($"Nom: {info.Name}, Taille: {info.Length} octets, Chemin: {info.FullName}");

// Copier le fichier
info.CopyTo("exemple_copie.txt", overwrite: true);

// Déplacer le fichier
info.MoveTo("nouvel_exemple.txt");

// Supprimer le fichier
var aSupprimer = new FileInfo("nouvel_exemple.txt");
if (aSupprimer.Exists)
    aSupprimer.Delete();

StreamReader et StreamWriter

StreamReader et StreamWriter sont utilisés pour les opérations de fichiers basées sur du texte. Avec un bloc using, le fichier est automatiquement fermé après l’opération.


// Écrire dans un fichier texte
using (var writer = new StreamWriter("texte.txt"))
{
    writer.WriteLine("Ligne 1");
    writer.WriteLine("Ligne 2");
}

// Lire à partir d’un fichier texte
using (var reader = new StreamReader("texte.txt"))
{
    string ligne;
    while ((ligne = reader.ReadLine()) != null)
        Console.WriteLine(ligne);
}

// Sortie :
// Ligne 1
// Ligne 2

FileStream

FileStream permet de lire et écrire des fichiers au niveau des octets. Il est particulièrement utile pour manipuler de gros fichiers comme des images ou des vidéos.


// Écrire des octets dans un fichier
byte[] donnees = { 72, 101, 108, 108, 111 }; // "Hello"
using (var fs = new FileStream("donnees.bin", FileMode.Create))
{
    fs.Write(donnees, 0, donnees.Length);
}

// Lire des octets à partir d’un fichier
using (var fs = new FileStream("donnees.bin", FileMode.Open))
{
    int b;
    while ((b = fs.ReadByte()) != -1)
        Console.Write((char)b);
}
// Sortie : Hello

BinaryReader et BinaryWriter

BinaryReader et BinaryWriter permettent d’écrire/lire des types primitifs (int, double, string, etc.) directement dans/à partir d’un flux binaire.


using (var bw = new BinaryWriter(File.Open("nombres.dat", FileMode.Create)))
{
    bw.Write(42);
    bw.Write(3.14);
    bw.Write("Bonjour");
}

using (var br = new BinaryReader(File.Open("nombres.dat", FileMode.Open)))
{
    int i = br.ReadInt32();
    double d = br.ReadDouble();
    string s = br.ReadString();

    Console.WriteLine($"{i}, {d}, {s}");
}
// Sortie : 42, 3.14, Bonjour

Exemple d’application : Gestion des fichiers de log

Dans l’exemple suivant, les journaux de l’application sont écrits dans un fichier avec StreamWriter, puis relus avec StreamReader. De plus, FileInfo est utilisé pour vérifier si le fichier existe et le créer si nécessaire.


public class Logger
{
    private readonly FileInfo _file = new FileInfo("app.log");

    public void Log(string message)
    {
        if (!_file.Exists)
            using (var created = _file.CreateText())
                created.WriteLine("Fichier de log créé.");

        using (var sw = new StreamWriter(_file.FullName, append: true))
            sw.WriteLine($"{DateTime.Now}: {message}");
    }

    public void ShowLogs()
    {
        if (_file.Exists)
        {
            using (var sr = new StreamReader(_file.FullName))
                Console.WriteLine(sr.ReadToEnd());
        }
        else
        {
            Console.WriteLine("Fichier de log introuvable.");
        }
    }

    public void ClearLogs()
    {
        if (_file.Exists)
            _file.Delete();
    }
}

class Program
{
    static void Main()
    {
        var logger = new Logger();
        logger.Log("Application démarrée.");
        logger.Log("Une erreur est survenue !");
        logger.ShowLogs();
        logger.ClearLogs();
    }
}

// Exemple de sortie :
// 19/09/2025 12:10:05: Application démarrée.
// 19/09/2025 12:10:05: Une erreur est survenue !

Résumé (TL;DR)

  • File : Opérations statiques sur les fichiers (WriteAllText, ReadAllText, AppendAllText, Exists, Delete).
  • FileInfo : Opérations sur fichiers basées sur des instances (Create, CopyTo, MoveTo, Delete, Exists).
  • StreamReader/StreamWriter : Lecture/écriture textuelle.
  • FileStream : Accès au niveau des octets, adapté aux gros fichiers.
  • BinaryReader/BinaryWriter : Lecture/écriture des types primitifs en format binaire.
  • L’API Stream permet de traiter efficacement de gros fichiers sans les charger entièrement en mémoire.

Articles connexes