DY

12 Input/Output

Nos programmes jusqu'alors utilise la mémoire vive de notre machine pour stocker des données sous la forme d'instances, de listes, etc.

Nous allons découvrir dans ce TP comment lire et écrire dans des fichiers avec C#.

Output - Écrire dans un fichier

Nous allons voir différentes manières d'écrire du texte dans un fichier notamment en utilisant la classe System.IO.File.

Nous aurons donc besoin d'importer le namespace System.IO via

using System.IO;
Méthode n°1 - Écrire une string dans un fichier

Tout d'abord nous avons besoin de définir le chemin vers notre fichier, nous pouvons utiliser un chemin relatif comme ci-dessous, ainsi le fichier sera créé à la racine du projet ou alors un chemin absolu vers un autre répertoire de notre machine.

String path = @"test.txt";

Une fois notre chemin définit au sein de la variable path, nous pouvons créer une string qui contiendra le texte à écrire au sein de notre fichier.

string text = "Hello World!";

Enfin nous pouvons écrire notre string dans notre fichier

File.WriteAllText(path, text);

Vous pouvez vérifier le contenu de votre fichier test.txt maintenant.

Méthode n°2 - Écrire plusieurs lignes

Écrire une string dans un fichier c'est bien, pouvoir écrire plusieurs lignes où chaque ligne est représenté par une string c'est mieux.

Nous allons d'abord instancier une liste de string (pensez à ajouter quelques string supplémentaires)

List<string> lines = new List<string>();
lines.Add("I'm you father");

Puis nous allons écrire dans notre fichier l'ensemble des lignes via:

File.WriteAllLines(path, lines);

Consulter le contenu de votre fichier test.txt que constatez vous ?

Méthode n°3 - Écrire plusieurs lignes, ligne à ligne

Nous avons écrit plusieurs lignes en une seule instructions, parfois il peut être utile de les écrire lignes par lignes au sein de notre fichier.

Nous allons définir une liste de personnage représenter par leurs noms:

List<string> persos = new List();
persos.Add("Ben Kenobi");
persos.Add("Luke Skywalker");
persos.Add("Darth Vader");
persos.Add("Darth Sidious");
persos.Add("Han Solo");

Ainsi qu'un chemin vers notre fichier rebels.txt:

string path_rebels = @"rebels.txt";

Nous souhaitons écrire dans notre fichier uniquement les personnages de l'alliance rebelles et non les seigneurs sith. Nous allons donc devoir écrire ligne par ligne notre fichier.

Pour vérifier qu'une string ne contient pas une autre string, C# nous propose la méthode Contains, par exemple:

line.Contains("Darth") // True, line est ici une string

Nous allons utiliser un StreamWriter pour écrire via un flux dans notre fichier. L'instruction using permet de délimiter un périmétre d'éxécution durant lequel le flux sera utilisé. Après celui-ci (le using) le flux sera automatiquement flushé et fermé.

using (StreamWriter file = new StreamWriter(path))
{
    foreach(string line in lines)
    {
        file.WriteLine(line);
    }
}

À vous de jouer, implémenter l'écriture ligne à ligne des personnages uniquement de l'alliance.

Méthode n°4: Ajouter du contenu à un fichier

Pour l'instant nous avons écrit dans un fichier en remplaçant son contenu. Toutefois il peut être utilse d'écrire à la suite d'un fichier sans en effacer son contenu.

Pour ce faire nous utilisons toujours le StreamWriter en lui passant un paramètre à true lors de son instanciation.

using (StreamWriter file = new StreamWriter(path, true))
{
    file.WriteLine("Another line"); // Add this line at the end of the text file
}

À vous de jouer, ajouter la princesse Leia Organa et le capitaine Wedge Antilles à notre liste de combattant de l'alliance.

Erreur éventuelle

Les conditions ci-dessous peuvent générer une exception:

Input - Lire un fichier

Nous allons voir différentes manières d'écrire du texte dans un fichier notamment en utilisant la classe System.IO.File.

Nous aurons donc besoin d'importer le namespace System.IO via

using System.IO;
Méthode n°1 - Lire le contenu complet d'un fichier

On définit toujours le chemin vers notre fichier

string path = @"rebels.txt";

Puis on récupérer l'ensemble du contenu du fichier au sein d'une string

string text = File.ReadAllText(path);

Afficher le contenu du fichier maintenant.

Méthode n°2 - Lire le contenu d'un fichier ligne à ligne

On peut également récupérer l'ensemble des lignes du fichiers sous la forme d'un tableau de string :

string[] lines = File.ReadAllLines(path);

Afficher les lignes une à une grâce à l'instruction foreach.

Erreur éventuelle

Les conditions ci-dessous peuvent générer une exception:

À vous de jouer

Et si on créer un simple éditeur de texte avec WinForms ?