# Programmation C sharp/Entrées-sorties

Les fonctions d'entrées-sorties utilisent l'espace de nom System.IO.

## La classe Stream

La classe abstraite Stream possède des méthodes permettant à la fois de lire et d'écrire. Cependant, l'écriture ou la lecture peut ne pas être autorisée (fichier en lecture seule, ...).

### Propriétés

La classe Stream possède les propriétés suivantes :

#### bool CanRead

    (lecture seule) Cette propriété vaut true quand la lecture est possible.

#### bool CanWrite

    (lecture seule) Cette propriété vaut true quand l'écriture est possible.

#### bool CanSeek

    (lecture seule) Cette propriété vaut true quand le positionnement dans le flux est possible (méthode Seek ou propriété Position).

#### bool CanTimeout

    (lecture seule) Cette propriété vaut true quand le flux peut expirer (fin de connexion pour une socket, ...).

#### long Length

    (lecture seule) Longueur du flux en nombre d'octets.

#### long Position

    Position courante dans le flux en nombre d'octets depuis le début.

#### int ReadTimeout

    Temps imparti pour la méthode Read, en millisecondes. L'accès à cette propriété peut déclencher le lancement d'une exception de type InvalidOperationException si la fonctionnalité n'est pas supportée.

#### int WriteTimeout

    Temps imparti pour la méthode Write, en millisecondes. L'accès à cette propriété peut déclencher le lancement d'une exception de type InvalidOperationException si la fonctionnalité n'est pas supportée.

### Méthodes

Les méthodes de la classe Stream sont les suivantes :

#### void Close

    Ferme le flux.

#### void Dispose

    Libère les ressources occupées par le flux.

#### void Flush

    Cette méthode vide les buffers d'écriture vers le support associé (fichier, socket, ...).

#### int ReadByte

    Cette méthode lit un octet et retourne sa valeur, ou -1 en cas d'erreur.

#### void WriteByte(byte value)

    Cette méthode écrit un octet.

#### int Read(byte buffer, int offset, int count)

    Cette méthode lit count octets dans le buffer spécifié, à partir de l'offset offset dans le tableau buffer. Elle retourne le nombre d'octets effectivement lus.

#### void Write(byte buffer, int offset, int count)

    Cette méthode écrit count octets du tableau buffer dont le premier octet est situé à l'offset offset.

#### void Seek(long offset, SeekOrigin origin)

    Déplace le pointeur d'écriture/lecture de offset octets depuis l'origine indiquée:
   * SeekOrigin.Begin : depuis le début du flux,
   * SeekOrigin.End : à partir de la fin du flux,
   * SeekOrigin.Current : à partir de la position courante dans le flux.

#### void SetLength(long value)

    Cette méthode modifie la longueur totale du flux (troncature ou remplissage avec des octets nuls).

### Méthodes asynchrones

Les méthodes Read et Write utilisant un tableau d'octet existent également en version asynchrone :

#### void EndWrite(IAsyncResult result).
### Membres statiques

La classe Stream possède également deux membres statiques :
* La constante Null est un flux dont la lecture ou l'écriture ne produit aucun effet.
* La méthode statique Synchronized retourne une version synchronisée du flux passé en paramètre.

## Fonctions asynchrones

Les fonctions dont le retour peut prendre du temps existent également en version asynchrone. La méthode appelée est alors celle dont le nom commence par Begin. Elle demande au pool de threads standard d'exécuter l'opération. Une fois l'opération terminée, le delegate passé à la fonction Begin doit appeler la fonction End correspondante pour récupérer le résultat.

### Exemple

Cet exemple utilise la version asynchrone de la méthode Read de la classe Stream.

## Flux de fichier

La classe FileStream dérive de la classe Stream. Elle possède donc les mêmes méthodes.
La classe FileStream possède les constructeurs suivants :
Les crochets indiquent les paramètres optionnels.